6

我有一个输出值列表的箭头 ( a b [c]) 和另一个接受该类型的单个值( ) 的箭头a c d。我需要的基本上是一种将它们链接起来或将第二个箭头提升到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 回答