Monad m => a - > [a - > m a] - >嘛

时间:2012-10-06 00:29:36

标签: haskell

我是Haskell的新手,我想知道是否有更好的方法来确定是否有一个重复库功能而不是Hoogle?

一个很好的例子:我有很多函数f :: Monad a => a -> m a我想要链接在一起,比如

f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4

但我宁愿写

chain :: Monad m => a -> [a -> m a] -> m a
chain = foldl (>>=) <$> return
f1234 = (flip chain) [f1, f2, f3, f4]

看起来非常基本,基础库是否提供了等同于chain的东西?

1 个答案:

答案 0 :(得分:17)

Hoogle很擅长这一点,绝对是寻找具有相同类型功能的正确工具。

鉴于它很简单,并且它没有出现在任何常见的地方,你也可以自己编写它从一些模糊的模块中导入它,部分原因是你不会导入其他任何东西。< / p>

(旁白:有些软件包似乎无法从hoogle中搜索到,所以如果你知道你所追求的功能,模块或软件包名称,并且hoogle不知道,请使用hayoo。)

我想插上

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

来自Control.Monad。这是我一直想要的构图操作员,直到找到它。在我的视图中,使用monad比使用>>=更自然。

你甚至可以直接使用它,它很清楚:

f1234 = f1 >=> f2 >=> f3 >=> f4

如果您为(a -> m a) -> (a -> m a) -> (a -> m a)进行搜索,则会显示,因此如果您正在寻找结合了某些内容列表的内容,那么未来的策略是搜索组合了两个并使用其中一个{{1}的函数函数。

因此

fold

chain' :: Monad m => [a -> m a] -> a -> m a
chain' = foldr (>=>) return

f1234 = chain' [f1,f2,f3,f4]

如果你愿意,但无论如何你的确很好。