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