箭头相当于mapM?

时间:2012-07-03 02:16:29

标签: haskell arrows

我正试着和我一起与箭头一起工作,我遇到了一些困难。我有一个上下文,我需要一个Arrow [a] [b],我想写一个Arrow a b并在箭头内部映射/序列,la mapM。具体来说,箭头是一个哈基尔Compiler,但我认为这对答案来说并不重要。

给出一个箭头

myInnerArrow :: Arrow a => a b c

如何将其提升为箭头

myOuterArrow :: Arrow a => a [b] [c]

我已经搜索了基础库,特别是在Data.ListControl.Arrow,但我找不到任何看起来会完成这项工作的东西。它是否以我不期望的名称存在?它是由其他一些图书馆提供的吗?因某种原因写不出来吗?

1 个答案:

答案 0 :(得分: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)

未经测试的代码,但应该有效。但请注意,泛型的功能会非常慢。我建议专门为你的箭头编写这个映射函数。