新手haskell - 顺序单子绑定

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

6
bindSeq = foldl' (>>=) 是什么意思? - Fixnum
1
是的,那差不多就是我想要的,谢谢。 - Steve B.
2
请查看 monad-loops 包中的 concatM。另外,您可以定义一个 Monoid 实例,例如 此处。也许已经有一个标准的实例被定义了,但我找不到。 - danidiaz
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

按照所需!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接