Hoogle 对此很有用,而且绝对是查找具有相同类型的函数的正确工具。
鉴于它很简单,而且它没有出现在任何常见的地方,你不妨自己编写它,就像从某个不起眼的模块中导入它一样,部分原因是你不会导入一大堆其他东西。
(另外:有些包似乎无法从 hoogle 中搜索到,因此,如果您知道您所追求的功能、模块或包名称而 hoogle 不知道,请使用 hayoo。)
我想插
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
从Control.Monad
. 这是我一直想要的合成运算符,直到我找到它为止。>>=
这是一种比我认为更自然的方式来处理 monad 。
你甚至可以直接使用它,它是如此清晰:
f1234 = f1 >=> f2 >=> f3 >=> f4
如果您 hoogle for (a -> m a) -> (a -> m a) -> (a -> m a)
,它就会显示出来,因此如果您正在寻找结合了某物列表的东西,那么未来的策略是搜索一个结合了两个功能并使用其中一个功能的fold
功能。
因此
chain' :: Monad m => [a -> m a] -> a -> m a
chain' = foldr (>=>) return
f1234 = chain' [f1,f2,f3,f4]
或者
chain'' :: Monad m => a -> [a -> m a] -> m a
chain'' = flip $ foldr (>=>) return
如果你愿意,但无论如何你的都很好。