3

我正在寻找惯用的方法来做到这一点。它有效,但似乎我必须在标准库中重新发明一些东西。这样做的正确方法是什么?

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

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
4

1 回答 1

1

正如@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

如预期的!

于 2015-04-06T17:34:50.930 回答