gpt4 book ai didi

haskell - 也许 monad 绑定(bind)函数优先级

转载 作者:行者123 更新时间:2023-12-04 13:28:24 25 4
gpt4 key购买 nike

this教程我发现了以下片段:

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

最佳答案

as far as I know, it is the opposite: 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,实际上并没有多大意义。 ,会吗? >>=总是返回一个 monad,它的 RHS 接受一个函数。所以在任何与 >>= 链接的单子(monad)表达式链中将在 (->) r monad,这几乎不是最有用的。

关于haskell - 也许 monad 绑定(bind)函数优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11313588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com