我创建了描述二叉树的新类型
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))
为什么?
答案 0 :(得分:12)
您忘记了值构造函数的名称
treehandle (Num 5 (Null) (Null))
答案 1 :(得分:7)
如果我是我,我会为数据构造函数找到不同的命名。 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
答案 2 :(得分:0)
感谢您的答复。我很感激。 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
有效!