【发布时间】: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
我不知道>>= 函数应该如何工作。起初,它采用Maybe a 值作为其第一个参数:deposit 100 account >>=
之后,它似乎将a -> Maybe a 作为它的第一个参数:withdraw 200 >>= 这怎么会被编译器批准? >>= 不应该总是把Maybe a 作为它的第一个参数吗?
如果>>= 函数的优先级按以下方式工作,一个可能的解决方案是:((a >>= b) >>= c) >>= d
但据我所知,情况恰恰相反:a >>= (b >>= (c >>= d))
【问题讨论】:
-
你可能把它和
do符号混淆了:do a <- b; c <- d; e是b >>= (\a -> d >>= (\c -> e))。 -
@sdcvvc:谢谢,这确实是我困惑的根源。
-
还要注意,它不是“也许 monad 绑定函数优先级”;对于不同的类型类实例,你不能有不同的优先级,所以它必须是 all monads 绑定的优先级。