我正试着和我一起与箭头一起工作,我遇到了一些困难。我有一个上下文,我需要一个Arrow [a] [b]
,我想写一个Arrow a b
并在箭头内部映射/序列,la mapM
。具体来说,箭头是一个哈基尔Compiler
,但我认为这对答案来说并不重要。
给出一个箭头
myInnerArrow :: Arrow a => a b c
如何将其提升为箭头
myOuterArrow :: Arrow a => a [b] [c]
我已经搜索了基础库,特别是在Data.List
和Control.Arrow
,但我找不到任何看起来会完成这项工作的东西。它是否以我不期望的名称存在?它是由其他一些图书馆提供的吗?因某种原因写不出来吗?
答案 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)
未经测试的代码,但应该有效。但请注意,泛型的功能会非常慢。我建议专门为你的箭头编写这个映射函数。