Возможно, приоритет функции привязки монады

В этом учебнике я нашел следующий фрагмент:

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))

6
задан Attila Kun 3 July 2012 в 14:54
поделиться