基本的にはmapM
のような機能を探しています。リストのすべての値をパラメータとして一連のモナドアクションを実行し、各モナド関数はm (Maybe b)
を返します。しかし、最初のパラメータの後で、関数がJust
の値を返し、その後はそれ以上実行せず、その値を返すようにするために、この関数を停止したい。Haskellで "findM"を実装していますか?
まあ、おそらくちょうど型シグネチャを表示することが容易になります:
bは最初のJust
値である
findM :: (Monad m) => (a -> m (Maybe b)) -> [a] -> m (Maybe b)
。結果のMaybe
は、find
ing(空のリストの場合など)からのものであり、Monadic関数によって返された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)
この関数を実装する最良の方法は、最初の「返却」後にモナドのアクションを実行しないものですか?どうなる何か:
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)
がうまくいけば、そこに明示的な再帰を使用していない答えは、可能な場合はライブラリ関数の組成物ですか?あるいはポイントフリーのでも?
ハ!私たちは同時に同じ考え方をしていたようです。あなたは少し速かったです。 :) – shang
はい。 'Maybe'の' MonadPlus'インスタンスの 'mzero'と' mplus'は 'Maybe'の' Alternative'インスタンスの 'empty'と' <|>'とまったく同じです。 'MaybeT'の' mzero'と 'mplus'は私が定義した' return Nothing'と '<||> '関数ですが、私の元の答えとjozefgの答えのような場合を除いて書かれています。被験者に関する完全な論文のために欠落しているのは、 '(Monad m)=> mを見ることからどうなるかについての説明です。 'f 'を使ってfのモナド変換器を書いて' mを置き換えることができます。 f'を新しいデータ型と組み合わせることで、インスタンスの作成を開始することができます。 – Cirdec
@Cirdec答えを更新しました。一般的なケースでは、そのような変圧器を構成することは不可能かもしれないが、実際には変圧器は必要ない。それはモノヨードを持ってそれを覆うだけで十分です。 –