関数パラメーターから取得した値を使用して計算を実行する高次関数があるとします。
f :: a -> (b -> c) -> d
ここで、a、b、c、d は具体的な型です。
次に、このタイプの関数があります
g :: b -> m c
ここで、m は何らかのモナドです。
f で g を使用する方法があります。つまり、f をm d
代わりに生成し、 d
2 番目のパラメーターとして g を使用できる関数に変換しますか?
具体的な例としては、m が IO モナドで、f が関数パラメータから取得した n 個の数値の合計を計算する関数であり、g が標準入力から数値を読み取る場合です。
f n g = sum $ map g (1..n)
g :: Int -> IO Int
g _ = readLn
標準入力を遅延リストに変換する関数があることは知っていますが、これでこの問題は解決しますが、私の実際の状況はそれほど単純ではありません。
グラフで何かを行うためのアルゴリズムがあるとします。このアルゴリズムは、関数パラメータを使用してノードの隣接ノードを決定します。これは、グラフを複数実装できるようにするためです。
今、私はこのアルゴリズムを非決定論的グラフ (リストモナド) または完全に知られていないグラフ (おそらくモナド) で使用したいと考えています。モナドを使用するようにアルゴリズムを書き直してから、基本的なケースで恒等モナドを使用できることは知っていますが、これが唯一の方法ですか? モナドなしでアルゴリズムを書く方が簡単だと思います。
この動作は可能ですか? そうすべきではない理由を見つけることができませんでしたが、それを行う方法を見つけることができませんでした。