Haskell 为Trie实现可折叠
我想使我的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
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上运行!谢谢你的快速回答。我关注的是儿童的类型,而不是功能定义。