haskell - (Eq a) 没有因使用 '==' 而产生的实例
问题描述
我正在尝试为这种数据类型编写一个 Eq 实例:
data Tree a b = Leaf b | Node a (Tree a b) (Tree a b)
deriving (Show)
我编写了我认为可行的琐碎代码:
instance Eq (Tree a b) where
(Leaf x) == (Leaf y) = x == y
(Node val1 l1 r1) == (Node val2 l2 r2) = (val1 == val2) && (l1==l2) && (r1==r2)
_ == _ = False
但后来我得到了错误:
• No instance for (Eq a) arising from a use of ‘==’
Possible fix: add (Eq a) to the context of the instance declaration
• In the first argument of ‘(&&)’, namely ‘(val1 == val2)’
In the expression: (val1 == val2) && (l1 == l2) && (r1 == r2)
In an equation for ‘==’:
(Node val1 l1 r1) == (Node val2 l2 r2)
= (val1 == val2) && (l1 == l2) && (r1 == r2)
我尝试添加Eq a => ...
,但随后我得到 type 的相同错误b
。而且我似乎也无法添加Eq b
。
任何帮助将不胜感激,10 倍!
解决方案
正如您所写,您必须放置类型约束Eq a
和Eq b
. 您只需将约束放在括号中并用逗号分隔它们。
instance (Eq a, Eq b) => Eq (Tree a b) where
(Leaf x) == (Leaf y) = x == y
(Node val1 l1 r1) == (Node val2 l2 r2) = (val1 == val2) && (l1==l2) && (r1==r2)
_ == _ = False
推荐阅读
- sql - SQL 获取数据 current_Datetime 减去 5 年?
- ios - Crashlytics 是否会在应用扩展上发生先前崩溃时调用 CrashlyticsDelegate?
- r - 如何在 CentOS 上安装最新版本的 R(目前为 4.0.0)?
- bash - 在写入时更改终端输出(日志)文件
- c - 双重递归中的 malloc 和 free
- bluetooth - 关于蓝牙服务发现协议的基本问题
- python - 如何在 Python 中将列名更改为工作日
- vba - 在 PowerPoint 中自动从 4:3 转换为 16:9,包括内容
- javascript - 如何让 setInterval 函数工作?
- python - ModuleNotFoundError:没有名为“”的模块