访问Haskell函数中的命名字段

时间:2010-02-09 12:12:46

标签: haskell ghci

我在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数据类型访问变量时,我从未遇到过范围问题。

1 个答案:

答案 0 :(得分:7)

您的size (Node n)模式需要具有正确的构造函数。在您的代码中n提取左侧元素。

试试这个(如果你真的想使用命名的模式):

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

甚至:

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

或者您可以在模式中提取标签:

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

或者只是忽略标签:

size (Node l _ r)   = size l + 1 + size r