gpt4 book ai didi

types - Haskell - 使用 Just 或 No 只是有所不同,但我不知道为什么

转载 作者:行者123 更新时间:2023-12-02 02:52:12 24 4
gpt4 key购买 nike

我在“Real World 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

我的问题是: Just 做了什么工作?数据构造函数做什么?当我删除它时,我会收到错误消息,例如
(in ghci)
......
<Main *> nodeAreSame (Node 3 Empty Empty) (Node 3 Empty Empty))

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

但是当我尝试比较“Just”和“No Just”版本之间的类型差异时:
nodeAreSameJust   :: (Eq t) => Tree t -> Tree t -> Maybe t

nodeAreSameNoJust :: (Eq a) => Tree (Maybe a) -> Tree (Maybe a) -> Maybe a

那么这里的关键点是什么?这是否意味着当我放置一个类型为 a 的 var 时在节点中,函数不会输出类型为 a 的节点,所以它得到一个错误?

最佳答案

事实上,没有Just 不是 使其类型错误。

这是交易。编码

nodeAreSame (Node a _ _) (Node b _ _)
| a == b = a
nodeAreSame _ _ = Nothing

输入正确,前提是 ab属于 Maybe t 类型一些 t ,因为这是 Nothing 的类型.因此,类型系统做出了这种推断。

现在,当你有一个像 3 这样的数字文字时,推断为 Num s => s 类型直到您实际将其提交到特定数据类型(如 IntDouble )。

因此,当它把这两个事实放在一起时,它假设如下:
Num (Maybe t) => 3 :: Maybe t .

因为没有 Num (Maybe t) 的实例,它在那时提示,然后才有机会提示 3 :: Maybe t没有意义。

关于types - Haskell - 使用 Just 或 No 只是有所不同,但我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3261844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com