6

このチュートリアルでは次のスニペットを見つけました。

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

4

1 に答える 1

14

私の知る限り、それは反対です。a >>= (b >>= (c >>= d))

いいえ。

GHCi> :i >>=
class Monad m where
  (>>=) :: m a -> (a -> m b) -> m b
  ...
    -- Defined in `GHC.Base'
infixl 1 >>=

infixl左結合であることを意味するので、a >>= b >>= c >>= d ≡ ((a >>= b) >>= c) >>= d

もしそうなら、それは実際にはあまり意味がありませんinfixrね?>>=常にモナドを返し、そのRHSは関数を取ります。したがって、リンクされたモナド表現のチェーンで>>=、モナドに含まれます(->) rが、これはほとんど最も有用なものではありません。

于 2012-07-03T14:58:55.243 に答える