我正在寻找惯用的方式来做到这一点。它可以工作,但是好像我必须在标准库中重新发明一些东西。什么是正确的方法?

我正在尝试传递函数列表并按顺序绑定(bind)它们。玩具示例:

bindSeq :: (Monad m) => m a ->  [(a -> m a)] -> m a
bindSeq m [] = m
bindSeq m (x:xs) = bindSeq ( m >>= x ) xs

bindSeq (Just 4) [ Just . (+1), Just . (+2)]
Just 7

最佳答案

正如@Fixnum在2013年所写,您的bindSeqfoldl' (>>=)
但是,如果您希望将其视为对值的“有效折叠”,则可以“戴上m色眼镜”并忽略m,然后查看剩下的内容。如果没有单调效果,则需要签名:a -> [a -> a] -> a

这是折叠功能应用程序,可以编写为foldl (flip ($))

因此,现在,“推广”该方法是有效的,我们将看到以下内容:

Prelude Control.Monad> :t foldM (flip ($))
foldM (flip ($)) :: Monad m => a -> [a -> m a] -> m a

如预期的!

关于haskell - 新手Haskell-顺序Monad绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17899372/

10-16 05:38