我正试图和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.List
和Control.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)
未经测试的代码,但应该工作.但请注意,泛型的功能会非常慢.我建议专门为你的箭头编写这个映射函数.