14

Arrows を理解して作業しようとしていますが、問題が発生しています。が必要なコンテキストがあり、Arrow [a] [b]を書き、Arrow a bそれを矢印内にマップ/シーケンス化したい a la mapM。具体的には、矢印は Hakyll ですCompilerが、答えにはあまり関係ないと思います。

与えられた矢印

myInnerArrow :: Arrow a => a b c

これを矢印に持ち上げるにはどうすればよいですか

myOuterArrow :: Arrow a => a [b] [c]

?

私は基本ライブラリ、特に と を精査しましたData.ListControl.Arrow、それが機能するように見えるものは何も見つかりません。予想外の名前で存在していませんか? 他のライブラリから提供されていますか?なんらかの理由で書き込めないのでしょうか?

4

1 に答える 1

14

選択せずにはいられません。リフティング関数には次のタイプがあります。

mapA :: (ArrowChoice a) => a b c -> a [b] [c]

実装する最も簡単な方法は、proc表記を使用することです。

mapA c =
    proc xs' ->
        case xs' of
            [] -> returnA -< []
            (x:xs) -> uncurry (:) ^<< c *** mapA c -< (x, xs)

テストされていないコードですが、動作するはずです。ただし、ジェネリック関数は非常に遅くなることに注意してください。このマッピング関数を矢印専用に作成することをお勧めします。

于 2012-07-03T02:35:34.977 に答える