В этом учебнике я нашел следующий фрагмент:
deposit :: (Num a) => a -> a -> Maybe a
deposit value account = Just (account + value)
withdraw :: (Num a,Ord a) => a -> a -> Maybe a
withdraw value account = if (account < value)
then Nothing
else Just (account - value)
eligible :: (Num a, Ord a) => a -> Maybe Bool
eligible account =
deposit 100 account >>=
withdraw 200 >>=
deposit 100 >>=
withdraw 300 >>=
deposit 1000 >>
return True
main = do
print $ eligible 300 -- Just True
print $ eligible 299 -- Nothing
Я не могу понять, как должна работать функция >>=
. Сначала он принимает значение Maybe a
в качестве первого параметра :deposit 100 account >>=
. Впоследствии, однако, кажется, что он принимает a -> Maybe a
в качестве своего первого параметра:withdraw 200 >>=
Как это могло быть одобрено компилятором? Разве >>=
не должен всегда принимать Maybe a
в качестве первого параметра?
Возможным решением было бы, если бы приоритет функции >>=
работал следующим образом:((a >>= b) >>= c) >>= d
Но, насколько я знаю, все наоборот:a >>= (b >>= (c >>= d))