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.Listand中Control.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 回答