我有以下类型和功能定义:
data Tree a = Tree a [Tree a]
list t = list' [t]
where list' [] = []
list' (Tree a hs:ts) = a : list' (ts ++ hs)
我有这个表达:
list (Tree (-1) [Tree 0 [ Tree 4 [], Tree 7 []],Tree 8 [Tree 5 []]])
哪位给了我:
[-1,0,8,4,7,5]
问题是我无法理解为什么!我认为我的问题是我无法理解为什么list'
将列表作为参数,而在第二个表达式中使用(Tree a hs:ts)
,而不是x:xs
。我是Haskell的新手,所以这可能是基本的,但我无法理解。
谢谢你,对不起我的英文!
答案 0 :(得分:4)
模式匹配可以嵌套。因此,x:xs
不是模式匹配非空列表的唯一方法。
当您将(Tree a hs : ts)
与树列表进行匹配时,它所执行的操作是将树列表的尾部绑定到ts
,并继续将列表中的第一个树与{{1} }。这会将Tree a hs
绑定到树列表的第一个元素的键,将a
绑定到树列表的第一个树的子树。