単純な 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(つまり、引数を反転して)、しかし運もありませんでした。私の質問は、私の謎の「フォールドバインド」コンビネーターの標準的な名前を知っている人はいますか?