3

我在 Haskell 中定义了一个 Tree 数据类型和一个关联的“size”方法,用于计算树中元素的数量。这以前有效,但是我已经更新了 Tree 数据类型以使用命名字段,如下面的定义:

data Tree a = Empty
 | Leaf {value::a}
 | Node {left :: (Tree a), value :: a, right :: (Tree a)}
 deriving (Eq, Ord, Show)

例如,我发现(通过在 GHCi 中玩耍)我可以使用函数(左 n)访问命名字段。但是,当我尝试使用此功能时,出现错误:

size :: Tree a -> Int
size Empty    = 0
size (Leaf l)   = 1
size (Node n)   = size (left n) + 1 + size (right n)

GHCi 简单地说“不在范围内:左”和右的等价物。Tree 定义在一个名为 Tree 的模块中,大小定义在一个名为 Main 的模块中,但是对于未命名的字段,在从 Tree 数据类型访问变量时,我从来没有遇到过范围问题。

4

1 回答 1

7

Your size (Node n) pattern needs to have a correct constructor. In your code n extracts the left element.

Try this (if you really want to use the named patterns):

size n@(Node _ _ _)   = size (left n) + 1 + size (right n)

Or even:

size n@(Node {})   = size (left n) + 1 + size (right n)

Or you can extract the labels in the pattern:

size (Node {left=l, right=r})   = size l + 1 + size r

or simply ignore the labels:

size (Node l _ r)   = size l + 1 + size r
于 2010-02-09T12:21:46.143 回答