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