gpt4 book ai didi

haskell - 在haskell中遍历和过滤树

转载 作者:行者123 更新时间:2023-12-04 05:59:57 25 4
gpt4 key购买 nike

我对 Haskell 很陌生(仍在努力完全理解单子(monad))。我有一个问题,我有一个树状结构

type Tree = [DataA]

data DataA = DataA1 [DataB]
| DataA2 String
| DataA3 String [DataA]
deriving Show

data DataB = DataB1 [DataA]
| DataB2 String
| DataB3 String [DataB]
deriving Show

我想做的是能够遍历它并生成带有过滤器的新树。例如,我可能想将树中的所有 DataB2 更改为“foo”。

当它们位于同一数据部分时,我已经看到了树的示例,并且构造函数相似。

在 python 世界中,我只需遍历列表,匹配我需要的任何内容,然后替换值。

在 Haskell 中,我猜我需要能够复制我的树,但是你如何处理隐藏在构造函数和不同数据类型中的列表?

最佳答案

您可以为此使用通用编程。

一个这样的通用编程库称为 Scrap Your Boilerplate。在模块的最顶部,通过编写以下内容启用 Scrap Your Boilerplate:

{-# LANGUAGE DeriveDataTypeable #-}

导入模块 Data.Generics .那么除了 Show , 也导出 TypeableData您的数据类型的实例。

现在您可以像这样编写您请求的函数:
toFoo :: Data a => a -> a
toFoo = everywhere (mkT step)
where
step (DataA2 _) = DataA2 "foo"
step x = x

这就是完成这项工作所需要做的一切。例如,当您调用 toFoo [DataA1 [], DataA2 "hi", DataA3 "yo" []] ,答案是 [DataA1 [],DataA2 "foo",DataA3 "yo" []] .

希望这可以帮助!

关于haskell - 在haskell中遍历和过滤树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2338529/

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