此"No Instance"错误的解决方案是什么?



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

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

它有效!

最新更新