Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 列出SYB或uniplate haskell中的搜索_Generics_Haskell_Tree Traversal - Fatal编程技术网

Generics 列出SYB或uniplate haskell中的搜索

Generics 列出SYB或uniplate haskell中的搜索,generics,haskell,tree-traversal,Generics,Haskell,Tree Traversal,我一直在使用uniplate和SYB,我正在尝试转换列表 比如说 type Tree = [DataA] data DataA = DataA1 [DataB] | DataA2 String | DataA3 String [DataA] deriving Show data DataB = DataB1 [DataA] | DataB2 String

我一直在使用uniplate和SYB,我正在尝试转换列表

比如说

    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
例如,我想遍历我的树并向所有[DataB]添加一个值

所以我的第一个想法是这样做:

changeDataB:: Tree -> Tree
changeDataB = everywhere(mkT changeDataB')
chanegDataB'::[DataB] -> [DataB]
changeDataB' <add changes here>
然后用它来变换。这似乎有点站不住脚,必须有更好的解决办法

更新: 我需要这样做的主要原因是我需要

  • 更改[数据]的顺序
  • 向[DataB]添加内容
  • 所以,如果你们都知道一个很酷的方法来创建一个匹配的mkT

    B1:B2:B3:B4:[](可以说是[DataB]的完整列表)

    而不是

    B2:B3:B4:[]
    或任何其他衍生产品


    我倾向于咬紧牙关,创建“数据库”,数据类型,并对其进行简单的mkT匹配。

    我最终创建了自己的转换函数

    所以


    创建一个更大的数据结构有点困难,但这是我能想到的最好的方法

    你说的“完整列表”到底是什么?你能提供一些在所需转换前后的“完整列表”的示例吗?假设我想用“foo”替换所有字符串。执行转换BI strToFoo strToFoo::String->String strToFoo x=“foo”将不起作用,因为String=[Char]所以让我们假设x=DataA2“hi”,这实际上意味着x=DataA2 h:i:[]我将在h:i:[]i:[]和[]上获得匹配,因此转换的结果将是x=foo:foo:foo:foo:foo(或类似的内容)我只是咬紧牙关,创建了我的转换函数,它解决了这个问题。我越想它,我就越不认为有一种不看父构造函数的巧妙方法。
        changeDataB:: Tree -> Tree 
        changeDataB = transformBi changeDataB'
        chanegDataB'::[DataB] -> [DataB]
        changeDataB' <add changes here>
    
    data DataBs = [DataB]
    
    dataBListTrans:: ([DataB] -> [DataB]) -> Tree -> Tree
    dataBListTrans f = transformBi $ dataAs f . (transformBi $ dataBs f)
     where
       dataAs f (DataA1 a bs) = DataA1 a (f bs)
       dataAs x = x
       dataBs f (DataB3 s bs) = DataB3 s (f bs)
       dataBs x = x