我是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等同的东西
发布于 2012-10-06 08:43:01
Hoogle在这方面做得很好,而且绝对是找到相同类型函数的正确工具。
考虑到它很简单,而且它不会出现在任何常见的地方,你不妨自己编写它,而不是从某个晦涩的模块导入它,部分原因是你不会导入大量其他东西。
(旁白:有些包似乎不能从hoogle中搜索,所以如果你知道你想要的函数、模块或包的名称,而hoogle不知道,那就使用hayoo。)
我想插上
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)来自Control.Monad。这是我一直想要的复合运算符,直到我找到它。在我看来,这是一种比>>=更自然的处理monads的方式。
你甚至可以直接使用它,这是非常清楚的:
f1234 = f1 >=> f2 >=> f3 >=> f4如果您搜索(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如果你喜欢的话,不过你的也不错。
https://stackoverflow.com/questions/12755655
复制相似问题