Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
Haskell 为Trie实现可折叠_Haskell_Trie - Fatal编程技术网

Haskell 为Trie实现可折叠

Haskell 为Trie实现可折叠,haskell,trie,Haskell,Trie,我想使我的Trie数据结构可折叠。基本数据结构如下所示: data-Trie a=Trie{ 价值观:也许是, 儿童::[(Char,Trie a)] }派生(显示) 我试图通过定义foldr来实现可折叠类: 实例F.可折叠Trie其中 foldr f z(Trie(仅v)儿童)= F.foldr(\a b->F.foldr F b a)(F v z)儿童 foldr f z(不包括儿童)= F.foldr(\a b->F.foldr F b a)z子级 此错误不会编译: Couldn't

我想使我的Trie数据结构可折叠。基本数据结构如下所示:

data-Trie a=Trie{
价值观:也许是,
儿童::[(Char,Trie a)]
}派生(显示)
我试图通过定义foldr来实现可折叠类:

实例F.可折叠Trie其中
foldr f z(Trie(仅v)儿童)=
F.foldr(\a b->F.foldr F b a)(F v z)儿童
foldr f z(不包括儿童)=
F.foldr(\a b->F.foldr F b a)z子级
此错误不会编译:

Couldn't match type `a' with `Trie a'
  `a' is a rigid type variable bound by
      the type signature for foldr :: (a -> b -> b) -> b -> Trie a -> b
      at Trie.hs:17:5
Expected type: [(Char, a)]
  Actual type: [(Char, Trie a)]
In the third argument of `F.foldr', namely `children'
In the expression:
  F.foldr (\ a b -> F.foldr f b a) (f v z) children

但是,如果我将子对象的类型更改为
mapchar(triea)
,则可折叠的实现不会发生更改。为了简单起见,我现在想保留关联列表。您能解释一下为什么foldr在地图和关联列表上的行为不同吗?

错误是因为您试图折叠键值列表 成对,而不是
Trie
s的列表。您要做的是忽略
Char
关键点,只需折叠到每个子节点中即可

foldr f z (Trie (Just v) children) =
    F.foldr (\(_, a) b -> F.foldr f b a) (f v z) children

foldr f z (Trie Nothing children) =
    F.foldr (\(_, a) b -> F.foldr f b a) z children

因为如果所有列表都是关联列表,那么
[]
可折叠的
实例就不是您想要的。您能详细说明一下吗?这基本上是我学习类型系统的尝试。当您在列表类型
[(a,b)]
处实例化
foldr
时,它将对类型
(a,b)
的元组进行操作,而如果您想将所有列表看作关联列表,您可能希望
foldr
仅对值部分进行操作,
b
部分。这正是在映射类型
map a b
处实例化
foldr
时发生的情况:它只在
b
s上运行!谢谢你的快速回答。我关注的是儿童的类型,而不是功能定义。