我创建了描述二叉树的新类型
data BinTree a = Null | Num a (BinTree a) (BinTree a)
deriving (Show)
并创建了以下函数:
treehandle :: BinTree a -> Bool
treehandle a = True
以检查至少输入的值。
当我输入值Null时,程序输出结果成功,但我无法输入二叉树。我这样尝试:
treehandle (5 (Null) (Null))
但获得:
<interactive>:66:13:
No instance for (Num (BinTree a1 -> BinTree a2 -> BinTree a0))
(maybe you haven't applied enough arguments to a function?)
arising from the literal ‘5’
In the expression: 5
In the first argument of ‘treehandle’, namely ‘(5 (Null) (Null))’
In the expression: treehandle (5 (Null) (Null))
为什么?
您忘记了值构造函数的名称
treehandle (Num 5 (Null) (Null))
如果我是你,我会为数据构造函数找到不同的命名。 Num
也是类型类的名称,这在查看错误消息时可能会非常混乱。
此外,deriving Show
没有正确缩进,并且您忘记了 treehandle (5 (Null) (Null))
中的数据构造函数。这是一个工作版本。
data BinTree a = Leaf | Node a (BinTree a) (BinTree a) deriving Show
treehandle :: BinTree a -> Bool
treehandle _ = True
test = treehandle $ Node 5 Leaf Leaf
treehandle
想要一个类型 BinTree a
的值,而您给它的只是一个Int
和两个空BinTree's
,它实际上尝试将Int
与两个空BinTree's
一起应用并失败了。您必须进行Node
才能获得一个BinTree a
,您可以将其传递给treehandle
我感谢您的回复。我很感激。Haskell是Lisp和Prolog的混合体的"野生"语言。渐渐地,我开始习惯了。我会分享我的结果。所以,这就是 BinTree 声明:
data BinTree a = Leaf | Val a (BinTree a) (BinTree a)
deriving (Show)
它类似于Prolog统一算法 - 我的意思是关于"反向"的定义如下:
reverse :: BinTree a -> BinTree a
reverse (Val a1 (a2) (a3)) = (Val a1 (reverse a3) (reverse a2))
reverse Leaf = Leaf
它有效!