私は基本的にmapM
リストのような関数を探しています - リスト内のすべての値をパラメーターとして取り、一連のモナド アクションを実行し、各モナド関数が戻りますm (Maybe b)
。ただし、関数が値を返すようにする最初のパラメーターの後に停止し、Just
それ以降は実行せず、その値を返すようにしたいと考えています。
まあ、おそらく型シグネチャを表示する方が簡単でしょう:
findM :: (Monad m) => (a -> m (Maybe b)) -> [a] -> m (Maybe b)
ここで、b は最初のJust
値です。Maybe
結果の は ing からのもの(空のリストなどの場合) であり、Monadic 関数によって返されるfind
とは何の関係もありません。Maybe
ライブラリ関数の単純なアプリケーションでこれを実装することはできないようです。私は使用できます
findM f xs = fmap (fmap fromJust . find isJust) $ mapM f xs
これは機能しますが、これをテストしたところ、 を呼び出す前にすべてのモナド アクションが実行されているように見えるfind
ため、ここでは怠惰に頼ることはできません。
ghci> findM (\x -> print x >> return (Just x)) [1,2,3]
1
2
3
-- returning IO (Just 1)
最初の "just" return の後にモナド アクションを実行しないこの関数を実装する最良の方法は何ですか? すること:
ghci> findM (\x -> print x >> return (Just x)) [1,2,3]
1
-- returning IO (Just 1)
または、理想的には、
ghci> findM (\x -> print x >> return (Just x)) [1..]
1
-- returning IO (Just 1)
うまくいけば、明示的な再帰を使用しない答えがあり、可能であればライブラリ関数の構成ですか? それともポイントフリーのものでしょうか?