Haskell - 使用Just或者只是差异,但我不知道为什么

sno*_*ntw 4 haskell types maybe

我在"真实世界Haskell"一书中找到了这样的代码,p68

data Tree a = Node a (Tree a) (Tree a)
            | Empty
              deriving (Show)

nodeAreSame (Node a _ _) (Node b _ _)
            | a == b = Just a
nodeAreSame _ _ = Nothing
Run Code Online (Sandbox Code Playgroud)

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

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

<interactive>:1:16:  
    No instance for (Num (Maybe a))
......
Run Code Online (Sandbox Code Playgroud)

但是当我尝试比较"Just"和"No Just"版本之间的类型差异时:

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

nodeAreSameNoJust :: (Eq a) => Tree (Maybe a) -> Tree (Maybe a) -> Maybe a
Run Code Online (Sandbox Code Playgroud)

那么这里的关键点是什么?这是否意味着当我a在节点中放入带有类型的var时,该函数将不会输出具有类型的节点a,因此会出错?

int*_*low 12

事实上,缺席Just不会使它变得不合适.

这是交易.代码

nodeAreSame (Node a _ _) (Node b _ _)
            | a == b = a
nodeAreSame _ _ = Nothing
并且ab某些类型的类型Maybe t,因为这是类型t.因此,类型系统进行了这种推断.

现在,当你有一个数字文字时Nothing,它被推断为类型,3直到你实际将它提交到特定的数据类型(如Num s => sInt).

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

Double.

由于没有实例Num (Maybe t) => 3 :: Maybe t,它在此之前抱怨,在有机会抱怨之前Num (Maybe t)毫无意义.