我是Haskell的一个相对入门的人,但是具有大量数学背景,尤其是代数,所以对我来说,诸如“一个Monad是endofunctors类别中的一个类群”之类的陈述对我来说不是问题。

即便如此,我只是理解Haskell中单子的一部分,在学习过程中,我发现自己编写了以下函数:

bindMap ::(Monad m) => [a -> m a] -> m a -> m a
bindMap (f:fs) s = bindMap fs (s >>= f)
bindMap _ s = s

这完全满足了我的目的,但似乎有一个显而易见的功能,我认为我应该可以找到它,或者使用一些简单的组合器进行定义,或者(可能)我应该以不同的方式考虑事物。

我最初是用类型签名写的
[a -> [a]] -> [a] -> [a]

这可能会更多地表明我的追求。想法是合并功能列表
a -> [a]

成为一个大功能。我在数独求解器中使用它。如果您认为可能还有其他相关背景,请告诉我。

最佳答案

也称为flip (foldl (>>=))

通常,如果您正在寻找类似[a] -> b的函数,那么您正在寻找折叠。要在monad中编写对象,您可能首先需要获取(>>=)。之所以有flip,是因为foldl接受的参数与您所需的顺序相反。

10-06 05:30