6

値のリストを出力する矢印 ( a b [c]) と、そのタイプの単一の値を受け入れる別の矢印( ) がありa c dます。基本的に必要なのは、それらをチェーンする方法、または 2 番目の矢印を に持ち上げる方法a [c] [d]です。

4

1 に答える 1

5

Arrow型クラスだけではこれを行うことはできません。持ち上げるには、ケースとケースのどちらかを選択a b cする必要があります。私たちにとって幸運なことに、まさにこの操作を提供します。a [b] [c][](:)ArrowChoice

mapA :: ArrowChoice a => a b c -> a [b] [c]
mapA f = proc list -> case list of
    []   -> returnA -< []
    x:xs -> do
        y  <- f      -< x
        ys <- mapA f -< xs
        returnA      -< y:ys

その場合、関数は次のようになります。

chain :: ArrowChoice a => a b [c] -> a c d -> a b [d]
chain f g = f >>> mapA g

表記がないと、リストコンストラクターを次procのように変換する関数が必要になります。Either

listCase :: [a] -> Either () (a, [a])
listCase []     = Left ()
listCase (x:xs) = Right (x,xs)

mapA f = arr listCase >>>
    arr (const []) ||| (f *** mapA f >>> arr (uncurry (:)))
于 2012-12-02T13:09:12.750 に答える