我是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
接受的参数与您所需的顺序相反。