在编写一个简单的 RPN 计算器的过程中,我有以下类型别名:
type Stack = List[Double]
type Operation = Stack => Option[Stack]
...我写了一段看起来很奇怪的 Scala 代码:
val newStack = operations.foldLeft(Option(stack)) { _ flatMap _ }
这需要初始stack
值并将列表应用于operations
该堆栈。每个操作都可能失败(即产生一个Option[Stack]
),所以我用flatMap
. 对此(在我看来)有点不寻常的是,我正在折叠一个单子函数列表,而不是折叠一个数据列表。
我想知道是否有一个标准函数可以捕获这种“折叠绑定”行为。当我尝试玩“Name That Combinator”游戏时,Hoogle 通常是我的朋友,所以我在 Haskell 中尝试了相同的脑力练习:
foldl (>>=) (Just stack) operations
这里的类型是:
foldl :: (a -> b -> a) -> a -> [b] -> a
(>>=) :: Monad m => m a -> (a -> m b) -> m b
所以我的神秘foldl (>>=)
组合器的类型,在做出类型foldl
和(>>=)
排列之后,应该是:
mysteryCombinator :: Monad m => m a -> [a -> m a] -> m a
...这又是我们所期望的。我的问题是在 Hoogle 中搜索具有该类型的函数不会产生任何结果。我尝试了其他一些我认为可能是合理的排列:(a -> [a -> m a] -> m a
即从非单子值开始),[a -> m a] -> m a -> m a
(即参数翻转),但也没有运气。所以我的问题是,有人知道我神秘的“折叠绑定”组合器的标准名称吗?