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