gpt4 book ai didi

haskell - 类似 mapAccumR 的递归方案超过 Fix?

转载 作者:行者123 更新时间:2023-12-02 10:35:23 27 4
gpt4 key购买 nike

我正在使用 recursion-schemes 中的函数,并努力弄清楚它是否提供了通用的东西 mapAccumR 。足够强大的东西来实现,例如:

f :: [Int] -> (Int,[Int])
f [] = (0,[])
f (x:xs) = let (sz,xs') = f xs in (sz+x, x*sz : xs')

...一次通过 Fix -ed 结构,例如:

data L a as = Empty | C a as

input :: Fix (L Int)
input = Fix (C 1 (Fix (C 2 (Fix Empty))))

zygo 似乎几乎是我想要的,除了我需要访问最终的 b (上例中的最终总和)。

我的实际用例是在注释时对 AST 进行类型检查,并返回表达式的类型。

最佳答案

您想通过Fix f调整值向上下降,同时像mapAccumR那样跟踪状态?这是用于向上顺序的cataM,以及用于跟踪状态的State monad。在您的示例中:

f :: Fix (L Int) -> (Fix (L Int), Int)
f = (`runState` 0) $ cataM $ ((.) . fmap) Fix $ \case
Empty -> pure Empty
C x xs -> do
sz <- get
put $ sz+x
return $ C (x*sz) xs

使用镜头:

makeClassyPrisms ''L

f = (`runState` 0) . transformMOf . _Fix . _C . _1 $ \x -> do
sz <- id <<+= x
return $ x*sz

全部未经测试。

或者您希望每个分支都有本地状态吗?

关于haskell - 类似 mapAccumR 的递归方案超过 Fix?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41227219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com