3

これを行うための慣用的な方法を探しています。それは機能しますが、標準ライブラリで何かを再発明する必要があるようです。これを行う正しい方法は何ですか?

関数のリストを渡して順番にバインドしようとしています。おもちゃの例:

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
4

1 に答える 1

1

@Fixnum が 2013 年に書いたように、あなたbindSeqfoldl' (>>=)

しかし、これを値の「効果的な折り畳み」として見たい場合は、「m色の眼鏡をかけ」て を見落とし、m残っているものを見ることができます. モナド効果がなければ、署名が必要です: a -> [a -> a] -> a.

これは折り畳み機能のアプリケーションであり、書くことができますfoldl (flip ($))

それでは、それを効果的に「促進」すると、次のようになります。

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

望んだ通りに!

于 2015-04-06T17:34:50.930 に答える