haskell - 新手 haskell - 顺序 monad 绑定(bind)

标签 haskell

我正在寻找执行此操作的惯用方法。它有效,但似乎我必须在标准库中重新发明一些东西。执行此操作的正确方法是什么?

我正在尝试传递函数列表并按顺序绑定(bind)它们。玩具示例:

bindSeq :: (Monad m) => m a ->  [(a -> m a)] -> m a
bindSeq m [] = m 
bindSeq m (x:xs) = bindSeq ( m >>= x ) xs

bindSeq (Just 4) [ Just . (+1), Just . (+2)]
Just 7

最佳答案

正如@Fixnum 在 2013 年所写,您的 bindSeqfoldl' (>>=)

但是如果你想把这看作是对值的“有效折叠”,那么你可以“戴上 m 色眼镜”并忽略 m,然后看看还剩下什么。如果没有单子(monad)效应,您需要一个签名:a -> [a -> a] -> a

这是折叠功能的应用,可以写成foldl (flip ($))

所以现在,“促进”它是有效的,我们看到以下内容:

Prelude Control.Monad> :t foldM (flip ($))
foldM (flip ($)) :: Monad m => a -> [a -> m a] -> m a

随心所欲!

关于haskell - 新手 haskell - 顺序 monad 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899372/

相关文章:

c - Haskell FFI 将多个数组传递给 C

Haskell:为什么我不能使用 liftM 线。获取内容

haskell - 有效地将字节打包成整数?

haskell - 无法完成 Haskell 教程

Haskell 不确定如何写 "vertical programs"

haskell - 在 Haskell 中合并 PDF 文件

haskell - Haskell 中的 Floating (a -> a), Num (a -> a -> a) 等

haskell - 在 monad 之后学习 Haskell 的下一步是什么?

string - 你如何在 haskell 中通过字符串过滤字符串列表?

haskell - RankNType 内的约束