新手haskell - 顺序monad绑定

时间:2013-07-27 15:22:09

标签: haskell

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

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

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

1 个答案:

答案 0 :(得分:1)

正如@Fixnum在2013年所写,您的bindSeqfoldl' (>>=)

但是如果你想把它看作是对价值的“有效折叠”,那么你可以“戴上米色眼镜”并忽略m,然后看看剩下什么。如果没有monadic效果,你需要一个签名:a -> [a -> a] -> a

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

所以现在,“促进”这是有效的,我们看到以下内容:

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

根据需要!