【问题标题】:Maybe monad bind function precedence也许 monad 绑定函数优先级
【发布时间】:2012-07-03 14:54:00
【问题描述】:

this 教程中我发现了以下sn-p:

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

我不知道&gt;&gt;= 函数应该如何工作。起初,它采用Maybe a 值作为其第一个参数:deposit 100 account &gt;&gt;=

之后,它似乎将a -&gt; Maybe a 作为它的第一个参数:withdraw 200 &gt;&gt;= 这怎么会被编译器批准? &gt;&gt;= 不应该总是把Maybe a 作为它的第一个参数吗?

如果&gt;&gt;= 函数的优先级按以下方式工作,一个可能的解决方案是:((a &gt;&gt;= b) &gt;&gt;= c) &gt;&gt;= d

但据我所知,情况恰恰相反:a &gt;&gt;= (b &gt;&gt;= (c &gt;&gt;= d))

【问题讨论】:

  • 你可能把它和do 符号混淆了:do a &lt;- b; c &lt;- d; eb &gt;&gt;= (\a -&gt; d &gt;&gt;= (\c -&gt; e))
  • @sdcvvc:谢谢,这确实是我困惑的根源。
  • 还要注意,它不是“也许 monad 绑定函数优先级”;对于不同的类型类实例,你不能有不同的优先级,所以它必须是 all monads 绑定的优先级。

标签: haskell monads maybe


【解决方案1】:

据我所知,是相反的:a &gt;&gt;= (b &gt;&gt;= (c &gt;&gt;= d))

没有。

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

infixl 表示它是左关联的,所以a &gt;&gt;= b &gt;&gt;= c &gt;&gt;= d ≡ ((a &gt;&gt;= b) &gt;&gt;= c) &gt;&gt;= d

如果是infixr,它实际上并没有多大意义,不是吗? &gt;&gt;= 总是返回一个 monad,它的 RHS 接受一个函数。因此,在 任何&gt;&gt;= 链接的一元表达式链中,(-&gt;) r monad 几乎不是最有用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    相关资源
    最近更新 更多