Haskell 为自定义类型创建Eq typeclass实例
我正在通过Chris Allen的Haskell编程书学习Haskell。需要以下方面的帮助(Typeclasses一章中的练习问题)。 我需要为数据类型创建Eq typeclass的实例:Haskell 为自定义类型创建Eq typeclass实例,haskell,Haskell,我正在通过Chris Allen的Haskell编程书学习Haskell。需要以下方面的帮助(Typeclasses一章中的练习问题)。 我需要为数据类型创建Eq typeclass的实例: data EitherOr a b = Hello a | Goodbye b 但当我按照下面的方式创建它时,我得到了一个错误,奇怪的是,它说,“解析输入'='上的错误。也许您需要let-in-do块。” 在尝试这些练习时,我还面临以下问题: data Which a = ThisOne a | That
data EitherOr a b = Hello a | Goodbye b
但当我按照下面的方式创建它时,我得到了一个错误,奇怪的是,它说,“解析输入'='上的错误。也许您需要let-in-do块。”
在尝试这些练习时,我还面临以下问题:
data Which a = ThisOne a | ThatOne a
在为两个数据构造函数定义(=)时,我必须对参数(v,v')使用相同的名称。我不明白原因
instance Eq a => Eq (Which a) where
(==) (ThisOne v) (ThisOne v') = v == v'
(==) (ThatOne v) (ThatOne v') = v == v'
提前谢谢。您输入错了。您的代码如下所示:
(==) (Hello v) (Hello v') = v = v' -- note the @v = v'@
或
或者两者兼而有之
你的第二个问题是胡说八道。您可以在那里定义任何变量名,而不仅仅是
v
和v'
data MyEither a b = Lefty a | Righty b
instance (Eq a, Eq b) => Eq (MyEither a b) where
(Lefty kumquat) == (Lefty jebediah) = kumquat == jebediah
(Righty superman) == (Righty batman) = superman == batman
你打错了。您的代码如下所示:
(==) (Hello v) (Hello v') = v = v' -- note the @v = v'@
或
或者两者兼而有之
你的第二个问题是胡说八道。您可以在那里定义任何变量名,而不仅仅是
v
和v'
data MyEither a b = Lefty a | Righty b
instance (Eq a, Eq b) => Eq (MyEither a b) where
(Lefty kumquat) == (Lefty jebediah) = kumquat == jebediah
(Righty superman) == (Righty batman) = superman == batman
不能复制。使用上述定义编写模块并将其加载到GHCi中。至少,不会产生编译器错误。“我必须使用…”-这是什么意思?还有其他错误吗?您忘记了第一个是a
Hello
,第二个是abye
,反之亦然。谢谢大家。我提供了下面的链接以及我的代码和错误的屏幕截图。我用Notepadd++编写了类型和类型类,没有创建模块。此外,我欢迎对Haskell的任何学习建议。到目前为止,每天花两个小时在这本书上。还计划加入格拉斯哥大学未来课程网上课程。@ USER 2159411请不要张贴你的代码的描述、截图或重新想象。复制并粘贴实际显示实际问题的实际代码。事实上如果“真实”代码太大,尝试创建一个仍然存在相同问题的小代码示例(这样,在询问其他人之前,您通常会发现诸如拼写错误之类的问题)。无法复制。使用上述定义编写模块并将其加载到GHCi中。至少,不会产生编译器错误。“我必须使用…”-这是什么意思?还有其他错误吗?您忘记了第一个是aHello
,第二个是abye
,反之亦然。谢谢大家。我提供了下面的链接以及我的代码和错误的屏幕截图。我用Notepadd++编写了类型和类型类,没有创建模块。此外,我欢迎对Haskell的任何学习建议。到目前为止,每天花两个小时在这本书上。还计划加入格拉斯哥大学未来课程网上课程。@ USER 2159411请不要张贴你的代码的描述、截图或重新想象。复制并粘贴实际显示实际问题的实际代码。事实上如果“真实”代码太大,尝试创建一个仍然存在相同问题的小代码示例(这样,在询问其他人之前,您通常会发现诸如拼写错误之类的问题)。谢谢Adam。我承认我的第二个问题是胡说八道,我不确定我错过了什么,那次我试了很多次。我又试了一次,结果成功了,但第一个问题仍然面临同样的问题。我拍摄了截图并提供了下面的链接。我用Notepad++编写了类型和类型类。我加载了没有EitherOr类型,它工作正常。我卸载了文件,添加了EitherOr,然后再次尝试加载。面对同样的错误,谢谢亚当。我承认我的第二个问题是胡说八道,我不确定我错过了什么,那次我试了很多次。我又试了一次,结果成功了,但第一个问题仍然面临同样的问题。我拍摄了截图并提供了下面的链接。我用Notepad++编写了类型和类型类。我加载了没有EitherOr类型,它工作正常。我卸载了文件,添加了EitherOr,然后再次尝试加载。面对同样的错误。