Haskell表达式评估?

时间:2014-05-08 23:46:28

标签: haskell

我有以下类型和功能定义:

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的新手,所以这可能是基本的,但我无法理解。 谢谢你,对不起我的英文!

1 个答案:

答案 0 :(得分:4)

模式匹配可以嵌套。因此,x:xs不是模式匹配非空列表的唯一方法。

当您将(Tree a hs : ts)与树列表进行匹配时,它所执行的操作是将树列表的尾部绑定到ts,并继续将列表中的第一个树与{{1} }。这会将Tree a hs绑定到树列表的第一个元素的键,将a绑定到树列表的第一个树的子树。