我正在查看Haskell O'Reilly书中的问题。我正在处理的问题是
Using the binary tree type that we defined earlier in this chapter,
write a function that will determine the height of the tree. The height
is the largest number of hops from the root to an Empty. For example, the
tree Empty has height zero; Node "x" Empty Empty has height one;
Node "x" Empty (Node "y" Empty Empty) has height two; and so on.
我在一个名为ch3.hs的文件中编写代码。这是我的代码:
36 data Tree a = Node a (Tree a) (Tree a)
37 | Empty
38 deriving (Show)
39
40 --problem 9:Determine the height of a tree
41 height :: Tree -> Int
42 height (Tree node left right) = if (left == Empty && right == Empty) then 0 else max (height left) (height right)
在终端中打开ghci并输入:load ch3.hs.当我这样做时,我收到以下错误:
Prelude> :load ch3.hs
[1 of 1] Compiling Main ( ch3.hs, interpreted )
ch3.hs:42:7: Not in scope: data constructor `Tree'
Failed, modules loaded: none.
我希望Tree数据构造函数应该存在,因为我在height方法上面的行中定义了它。但是当我尝试加载文件时,我被告知数据构造函数不在范围内。感谢您对此错误发生原因的帮助和解释。谢谢, 凯文
答案 0 :(得分:22)
更改
height (Tree node left right)
到
height (Node node left right)
这意味着模式匹配适用于algebraic data type(ADT)的构造函数。 Tree
不是构造函数,它是ADT的名称。
顺便说一句,你必须注释掉你的函数签名声明来编译代码,因为它包含一个错误。
然后,您可以通过
检查推断的类型:t height
答案 1 :(得分:5)
您的代码在多个级别上都是错误的。看起来你误解了代数数据类型。
Tree
始终是特定类型的Tree
- 您在其声明中称为a
,可能是任何类型(因为您没有不要约束它。因此,heigth
必须采用某种类型的Tree
- Tree SomeType
。您可以而且应该使用SomeType
的最通用类型,即类似a
的类型变量。Node a (Tree a) (Tree a)
或Empty
- 以匹配,而不是作为整体类型。因此height (Node ...)
会匹配Node
,height (Empty)
会匹配Empty
,height (Tree ...)
会尝试匹配名为Tree
的构造函数,但是没有。这是你收到的错误信息。==
)与构造函数。如果你写deriving (Show, Eq)
,它实际上会有效。但您应该使用模式匹配来确定您是否已达到Empty
Node
,而不是Empty
- 您应该为Empty
添加一个条款。height
的最大值 - 这反过来只会返回0或他们孩子的最大值height
等无限期。你必须在每个级别增加结果;)答案 2 :(得分:2)
您与构造函数进行模式匹配,即{{1>} ADT的个案。 Tree
正是他们所有人的总和。
这样直截了当,和,最重要的是,正确:
Tree