【发布时间】:2015-10-08 04:01:00
【问题描述】:
考虑 Haskell 中的以下 2 个表达式:
foldl' (>>=) Nothing (repeat (\y -> Just (y+1)))
foldM (\x y -> if x==0 then Nothing else Just (x+y)) (-10) (repeat 1)
第一个需要永远,因为它试图评估无限表达式
...(((Nothing >>= f) >>= f) >>=f)...
Haskell 只会尝试从里到外评估它。
然而,第二个表达式立即给出了 Nothing。我一直认为 foldM 只是使用 (>>=) 进行折叠,但它会遇到同样的问题。所以它在这里做了一些更聪明的事情——一旦它击中它就知道停止。 foldM 实际上是如何工作的?
【问题讨论】:
-
如果你没有看到 - 在这些问题上有一个nice article on the haskell wiki(没有提到
foldM,但@dfeuer 已经在那里提供了帮助) -
请注意,您可以点击 Hackage 文档中的“源”链接自行阅读源代码。