haskell - 单子(monad) m => a -> [a -> m a] -> m a

标签 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 的东西? ?

最佳答案

Hoogle 对此很有用,而且绝对是查找具有相同类型的函数的正确工具。

鉴于它很简单,而且它没有出现在任何常见的地方,你不妨自己编写它,就像从某个不起眼的模块中导入它一样,部分原因是你不会导入一大堆其他东西。

(另外:有些包似乎无法从 hoogle 中搜索到,因此,如果您知道您所追求的功能、模块或包名称而 hoogle 不知道,请使用 hayoo。)

我想插

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

来自 Control.Monad .这是我一直想要的合成运算符,直到我找到它为止。与 >>= 相比,使用 monad 是一种更自然的方式。在我看来。

你甚至可以直接使用它,它是如此清晰:
f1234 = f1 >=> f2 >=> f3 >=> f4

如果你 hoogle 为 (a -> m a) -> (a -> m a) -> (a -> m a),它就会出现,因此,如果您正在寻找结合了某物列表的东西,那么 future 的策略是搜索一个结合了两者的函数并使用 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

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

关于haskell - 单子(monad) m => a -> [a -> m a] -> m a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12755655/

相关文章:

haskell - 记录更新的内部行为如何?

haskell - 理解 Haskell 中的递归斐波那契函数

haskell - 持久过滤器 : And operation in filters when using Or

Haskell GADT 'Show' - 实例类型变量推导

haskell - 循环列表中 where 子句的计算

haskell - 带有可遍历的任意单子(monad)的组合总是单子(monad)吗?

haskell - 在haskell-indentation模式下自定义缩进宽度

haskell - 是否可以在 Haskell 的 HXT 上使用 Text 或 ByteString?

haskell - Haskell 中的新行

list - 浏览 Haskell 中的列表拆分功能