作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我正在使用 recursion-schemes 中的函数,并努力弄清楚它是否提供了通用的东西 mapAccumR 。足够强大的东西来实现,例如: f :: [Int] -> (Int,[Int]) f
我是一名优秀的程序员,十分优秀!