2010-02-09 17 views
3

我在Haskell中定义了一个Tree数据类型,并且在关联的'size'方法中计算了树中元素的个数。在此之前的工作,但是我已经更新为使用命名字段为如下定义的树数据类型:在Haskell函数中访问命名的字段

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数据类型访问变量的情况,使用非命名域时,我从来没有遇到范围问题。

回答

7

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

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

size [email protected](Node _ _ _) = size (left n) + 1 + size (right n) 

甚至:

size [email protected](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 
+0

我试过所有的建议,但我仍然得到'不在范围内'的错误。我可以在GHCi中使用'left'和'right',但似乎无法在我的主模块中使用它们。 – benwad 2010-02-09 13:19:24

+1

您是否在模块中导出名称? (这些名字也是功能)。你需要在模块代码中使用“module TreeModule(Tree Node Leaf left right)”。 – 0xfe 2010-02-09 13:24:20

+0

谢谢 - 我已经从代码中省略了左值,右值和值声明。 – benwad 2010-02-09 13:29:30