Дело в том, что путает людей много, когда они видят >>=
сигнатуру типа, является то, что она выглядит однобоко
Если вы +
вы получите подпись, как это:
(+) :: Num a
=> a -- 1st arg
-> a -- 2nd arg
-> a -- return-type
Если вы принять .
вы получите это:
(.) :: (b -> c) -- 1st arg, a function from b to c
-> (a -> b) -- 2nd arg, a function from a to b
-> a -> c -- return-type, a function from a to c
пока ничего не страшно
Теперь посмотрим на >>=
(>>=) :: Monad m
=> m a -- 1st arg, a monad a
-> (a -> m b) -- 2nd arg, a function from a to a monad b
-> m b -- return-type, a monad b
1-ый аргумент не соответствует 2-ым, но это нормально, и я собираюсь показать, почему.
Так скажем, у вас есть следующие две функции:
f :: Monad m => a -> m a -- we just need the type signatures
g :: Monad m => a -> m a
Затем мы делаем следующее:
\a -> f a >>= \b -> g b
Что тип f a
? это m a
, какой тип g b
? это m b
Так в основном то, что я сделал это:
function: \a -> f a >>= \b -> g b
types : a -> m a b -> m b
Какой тип аргументов >>=
«s? Посмотрите еще раз:
function: \a -> f a >>= \b -> g b
types : a -> m a b -> m b
>>=-args: m a -> (b -> m b)
Таким образом, в сущности, что мы сделали здесь, путем добавления лямбда-выражения, мы завершили «отсутствует» тип информации, который сделал подпись «покосившийся»
\n -> (Just n >>= (\m -> Just (m + 1))) -- added extra() for highlighting
или иначе говоря:
fn a = Just a >>= (\m -> Just (m + 1))
fn 3 -- returns Just 4
по сути, я просто сделал, было создать функцию fn
с подписью a -> m a
... Точно так же, как f
и g
. Итак, что такое >>=
, это способ составить монадические функции. Точно так же, как .
- это способ составить нормальный функции.
Часы [Don't fear the Monad], которые были источником вдохновения для этого ответа, и в конечном итоге это заставило меня понять, почему он выглядит так, как он.
Что вы подразумеваете под этим? Пожалуйста, будьте более конкретными. – AJFarmar
Как пример '(+)' связан с монадами? Оператор monadic bind равен '>> =' и не связан с приложением '(+) 4 9' или частичным приложением' (+) 4'. – chi
@chi Они связаны тем, что и '(+)', и '(>> =)' являются двоичными операторами, но это в значительной степени. – rightfold