我正在使用来自recursion-schemes
的函数,但我很难弄清它是否提供了一些类似于通用mapAccumR
的东西。是否有足够强大的功能可以实现例如:
f :: [Int] -> (Int,[Int])
f [] = (0,[])
f (x:xs) = let (sz,xs') = f xs in (sz+x, x*sz : xs')
在处理像下面这样的Fix
结构时,可以一次性完成:
data L a as = Empty | C a as
input :: Fix (L Int)
input = Fix (C 1 (Fix (C 2 (Fix Empty))))
zygo
看起来就是我需要的,但我需要访问最终的 b
(如上例中的最终总和)。我的实际用例是在注释AST时进行类型检查,并返回表达式的类型。
para
。 - dfeuerpara
足够强大,可以实现f
,但是时间复杂度是二次的,这不是我想要的。我想我也可以使用两个cata
,一个用来标记和累积大小,另一个用来从子树中去除这些大小,但我也不想这样做。你说得对,也许如果我仔细思考一下签名,我就能解答自己的问题,但我想我已经决定这一切都有些愚蠢了。 - jberrymanrecursion-schemes
的文档非常出色。很明显zygo
是最佳选择。 - scooter me fecit