箭头相当于mapM?

Mic*_*and 14 haskell arrows

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

给出一个箭头

myInnerArrow :: Arrow a => a b c
Run Code Online (Sandbox Code Playgroud)

我该如何将其提升为箭头

myOuterArrow :: Arrow a => a [b] [c]
Run Code Online (Sandbox Code Playgroud)

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

小智 14

你不能没有选择.提升功能将具有以下类型:

mapA :: (ArrowChoice a) => a b c -> a [b] [c]
Run Code Online (Sandbox Code Playgroud)

最简单的实现方法是使用proc符号:

mapA c =
    proc xs' ->
        case xs' of
            [] -> returnA -< []
            (x:xs) -> uncurry (:) ^<< c *** mapA c -< (x, xs)
Run Code Online (Sandbox Code Playgroud)

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