解决此“无实例”错误的方法是什么?

时间:2019-01-21 18:20:03

标签: haskell

我创建了描述二叉树的新类型

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))

为什么?

3 个答案:

答案 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

有效!