Types Haskell-使用“仅仅”或“不”都会产生影响,但我不';我不知道为什么

Types Haskell-使用“仅仅”或“不”都会产生影响,但我不';我不知道为什么,types,haskell,maybe,Types,Haskell,Maybe,我在《真实世界哈斯克尔》一书中找到了这样的代码,第68页 我的问题是:数据构造函数只做了什么工作?当我删除它时,我会收到如下错误消息 (in ghci) ...... <Main *> nodeAreSame (Node 3 Empty Empty) (Node 3 Empty Empty)) <interactive>:1:16: No instance for (Num (Maybe a)) ...... 那么这里的关键点是什么?这是否意味着当我在

我在《真实世界哈斯克尔》一书中找到了这样的代码,第68页

我的问题是:
数据构造函数只做了什么工作?当我删除它时,我会收到如下错误消息

(in ghci)
......
<Main *> nodeAreSame (Node 3 Empty Empty) (Node 3 Empty Empty))  

<interactive>:1:16:  
    No instance for (Num (Maybe a))
......

那么这里的关键点是什么?这是否意味着当我在节点中放置类型为
a
的var时,函数不会输出类型为
a
的节点,因此会出现错误?

您还希望返回什么,只需
a
?这行不通,因为
a
Nothing
不是同一类型。函数的所有定义都必须返回相同的类型
Nothing
只是一个
匹配,因为它们都是类型
可能是a

在非正义版本中,它要求树中的项是类型可能是a

我不完全确定错误的原因是Num(可能是a)。我认为如果使用字符串而不是3,则错误更具启发性

*Main> nodeAreSameNoJust (Node "arst" Empty Empty) (Node "arst" Empty Empty)
<interactive>:1:24:

Couldn't match expected type `Maybe a'
       against inferred type `[Char]'
In the first argument of `Node', namely `"arst"'
In the first argument of `nodeAreSameNoJust', namely
    `(Node "arst" Empty Empty)'
In the expression:
    nodeAreSameNoJust
      (Node "arst" Empty Empty) (Node "arst" Empty Empty)
*Main>nodearesamanojust(节点“arst”为空)(节点“arst”为空)
:1:24:
无法匹配预期的类型“可能是a”
针对推断类型“[Char]”
在“Node”的第一个参数中,即“arst”
在'nodearesamanojust'的第一个参数中,即
`(节点“arst”为空)
在表达式中:
nodearesamanojust
(节点“arst”为空)(节点“arst”为空)

这里更清楚的是,它期待的可能是a型的东西。在这两种情况下,函数的第二种情况都是Nothing,因此结果类型被推断为a。通过包含Just,您在树中使用的值将被放入maybe类型中。如果没有这一点,它希望生成的a是与Nothing相同的类型,因为函数的每个部分都需要是相同的类型。

事实上,缺少
只是
不会使其类型错误

事情是这样的。代码

节点名称(节点a_uu)(节点b_uu)
|a==b=a
nodeAreSame=无

如果
a
b
属于
类型,则对于某些
t
的类型是
t
,因为这是
Nothing
的类型。因此,类型系统进行了这种推断

现在,当您有一个像
3
这样的数值文本时,它被推断为
Num s=>s
类型,直到您实际将其提交到一个特定的数据类型(比如
Int
Double

因此,当它把这两个事实放在一起时,它假设如下:

Num(可能是t)=>3::可能是t

由于没有
Num(可能是t)
的实例,因此它在得到机会抱怨
3::可能是t
毫无意义之前,会在那一点上抱怨

nodeAreSameJust   :: (Eq t) => Tree t -> Tree t -> Maybe t

nodeAreSameNoJust :: (Eq a) => Tree (Maybe a) -> Tree (Maybe a) -> Maybe a
*Main> nodeAreSameNoJust (Node "arst" Empty Empty) (Node "arst" Empty Empty)
<interactive>:1:24:

Couldn't match expected type `Maybe a'
       against inferred type `[Char]'
In the first argument of `Node', namely `"arst"'
In the first argument of `nodeAreSameNoJust', namely
    `(Node "arst" Empty Empty)'
In the expression:
    nodeAreSameNoJust
      (Node "arst" Empty Empty) (Node "arst" Empty Empty)
nodeAreSame (Node a _ _) (Node b _ _) | a == b = a nodeAreSame _ _ = Nothing