首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monad m => a -> [a -> m a] -> m a

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

Stack Overflow用户
提问于 2012-10-06 08:29:36
回答 1查看 463关注 0票数 13

我是Haskell的新手,我想知道是否有比Hoogle更好的方法来发现库功能是否重复?

一个恰当的例子:我有许多函数f :: Monad a => a -> m a,我希望将它们链接在一起,比如

代码语言:javascript
复制
f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4

但我更愿意写

代码语言:javascript
复制
chain :: Monad m => a -> [a -> m a] -> m a
chain = foldl (>>=) <$> return
f1234 = (flip chain) [f1, f2, f3, f4]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-06 08:43:01

Hoogle在这方面做得很好,而且绝对是找到相同类型函数的正确工具。

考虑到它很简单,而且它不会出现在任何常见的地方,你不妨自己编写它,而不是从某个晦涩的模块导入它,部分原因是你不会导入大量其他东西。

(旁白:有些包似乎不能从hoogle中搜索,所以如果你知道你想要的函数、模块或包的名称,而hoogle不知道,那就使用hayoo。)

我想插上

代码语言:javascript
复制
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

来自Control.Monad。这是我一直想要的复合运算符,直到我找到它。在我看来,这是一种比>>=更自然的处理monads的方式。

你甚至可以直接使用它,这是非常清楚的:

代码语言:javascript
复制
f1234 = f1 >=> f2 >=> f3 >=> f4

如果您搜索(a -> m a) -> (a -> m a) -> (a -> m a),它就会出现,所以如果您正在寻找结合了一些东西列表的东西,那么未来的策略是搜索一个结合了这两个函数的函数,并使用其中一个fold函数。

因此

代码语言:javascript
复制
chain' :: Monad m => [a -> m a] -> a -> m a
chain' = foldr (>=>) return

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

代码语言:javascript
复制
chain'' :: Monad m => a -> [a -> m a] -> m a
chain'' = flip $ foldr (>=>) return

如果你喜欢的话,不过你的也不错。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12755655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档