gpt4 book ai didi

haskell - 我可以使用 `Traversal` 获取存储在分支中的项目的 `Control.Lens.Plated` 吗?

转载 作者:行者123 更新时间:2023-12-02 15:19:22 26 4
gpt4 key购买 nike

我可以轻松地对存储在叶子中的项目进行遍历:

data Tree a = Br (Tree a) (Tree a) | Lf a
deriving (Data)

instance Plated (Tree a) where

makePrisms ''Tree

leaves :: Traversal' (Tree a) a
leaves = deep _Lf

但是如果我从分支中取出一些东西,deep就无法继续下去。对于分支中的数据,我似乎能实现的最好效果是折叠:

data Tree a = Br a (Tree a) (Tree a) | Lf
deriving (Data)

instance Plated (Tree a) where

makePrisms ''Tree

branchData :: Fold (Tree a) a
branchData = cosmos._Br._1

显然可以手动构造一个遍历,因为这个可以可遍历:

instance Traversable Tree where
sequenceA Lf = pure Lf
sequenceA (Br x l r) = Br <$> x <*> sequenceA l <*> sequenceA r

Plated 能以某种方式自动为我们做这件事吗?

最佳答案

我不相信可以使用 Plated 来实现,但是使用 Data.Data.Lens 中的 template 来实现是微不足道的。 :

branchData :: Data a => Traversal' (Tree a) a
branchData = template

模板查找可以访问的类型的所有元素,而无需通过相同类型。

<小时/>

我可以从 Plated 获得的最接近遍历的东西(除了你提到的 cosmos 折叠)是 transformM::(Monad m, Plated a) => LensLike' m a a.它可以用作 Setter 并可以执行其他一些操作。

transformM 需要 Monad(而不是遍历所需的 Applicative)的原因是我们需要在更新节点之前更新子节点,这意味着需要排序。不可能进行同时指向某个节点及其子节点的遍历。

关于haskell - 我可以使用 `Traversal` 获取存储在分支中的项目的 `Control.Lens.Plated` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35615345/

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