作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一个人如何严格地折叠一个单子(monad)? Data.Foldable
有严格的foldl'
和单子(monad)foldlM
, 但没有严格的 foldlM'
?单子(monad)本身是否以某种方式定义了严格性?如果是这样,如何确定它是什么?
想象一下,我必须确定一个庞大的环元素列表的乘积是否为零,但我的环不是一个整数域,即它包含零除数。在这种情况下,我应该递归地拖尾 foldl
我的乘法***
在列表中,但返回 False
产品变为零的那一刻,而不是等待完整的产品。
safelist :: [p] -> Bool
safelist [] = True
safelist (x:xs) = snd $ foldl' f (x,True) xs
where f (u,b) v = (w, b && w /= Zero) where w = u *** v
Maybe
稍微简化此代码monad 的
foldlM
但这样做似乎缺乏所需的严格性。
最佳答案
没有这样的标准函数,但很容易定义:
foldM' :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
foldM' _ z [] = return z
foldM' f z (x:xs) = do
z' <- f z x
z' `seq` foldM' f z' xs
foldM
,但使用相同的
seq
在里面说
foldl'
确实(与
foldl
相比)。它可能没有在任何标准中定义,因为它不太可能很有用:对于大多数 monad,
(>>=)
在您需要使用左折叠而不溢出堆栈的意义上是“严格的”;这仅在返回值本身包含过多的 thunk 时才有用,但是
foldM
的有用应用将使用最后一步的值执行一些单子(monad)计算,这不太可能。
foldM'
会让它更优雅。
关于haskell - Haskell 有 foldlM' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919026/
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
一个人如何严格地折叠一个单子(monad)? Data.Foldable 有严格的foldl'和单子(monad)foldlM , 但没有严格的 foldlM' ?单子(monad)本身是否以某种方式
我是一名优秀的程序员,十分优秀!