繁体   English   中英

Haskell有折叠吗?

[英]Does Haskell have foldlM'?

如何严格折叠monad? Data.Foldable具有严格的foldl'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一个有用的应用程序将使用上一步的值执行一些foldM计算,这使得这不太可能。

我认为你的代码很简单; 我怀疑foldM'会让它变得更优雅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM