我是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
的东西?
答案 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]
如果你愿意,但无论如何你的确很好。