3

次の2つのクライスリ矢印がある場合:

stdoutProcessA :: Kleisli Maybe String (IO String)
writeToFileA :: Kleisli Maybe (FilePath, String) (IO ())

私は次のような何かを書くことができるようにしたいと思います:

compile = proc src -> do
    output <- stdoutProcessA -< "..."
    writeToFileA -< ("...", output)
    ...

Stringと一致しないため、もちろん機能しませんIO String。一方、両方を定義してタイプにすることは可能ですstdoutProcessAwriteToFileA、その場合、他のものに必要なKleisli IO ...タイプの矢印でそれらを構成することはできません。Kleisli Maybe ...

私はまだ矢印の経験があまりないので、おそらく明らかな何かが欠けています。上記をどのように行うのでしょうか?

4

1 に答える 1

5

これらの矢印は私にはあまり意味がありません。

stdoutProcessA :: Kleisli Maybe String (IO String)
writeToFileA :: Kleisli Maybe (FilePath, String) (IO ())

Maybe (IO a)あなたがおそらく意味したとき、それらは結果を伴う関数を表しますIO (Maybe a)。後者のタイプIOは失敗する可能性のあるアクションを表しますが、前者のタイプでは失敗または成功はまったく依存できませんIO

組み合わせる正しい方法はIO、次のようにモナド変換子Maybeを使用することです。MaybeT

stdoutProcessA :: Kleisli (MaybeT IO) String String
writeToFileA :: Kleisli (MaybeT IO) (FilePath, String) ()

他の矢印をとして書く場合Monad m => Kleisli (MaybeT m) a b、それらは持ち上げることなくこれらの矢印とうまく構成されているはずです。または、

lift' :: Monad m => Kleisli Maybe a b -> Kleisli (MaybeT m) a b
lift' (Kleisli f) = Kleisli $ \x -> MaybeT (return $ f x)

Kleisli Maybe既存の矢印を必要な場所に持ち上げますKleisli (MaybeT IO)

于 2012-11-22T01:54:53.937 に答える