Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为自定义类型创建Eq typeclass实例_Haskell - Fatal编程技术网

Haskell 为自定义类型创建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

我正在通过Chris Allen的Haskell编程书学习Haskell。需要以下方面的帮助(Typeclasses一章中的练习问题)。 我需要为数据类型创建Eq typeclass的实例:

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
,第二个是a
bye
,反之亦然。谢谢大家。我提供了下面的链接以及我的代码和错误的屏幕截图。我用Notepadd++编写了类型和类型类,没有创建模块。此外,我欢迎对Haskell的任何学习建议。到目前为止,每天花两个小时在这本书上。还计划加入格拉斯哥大学未来课程网上课程。@ USER 2159411请不要张贴你的代码的描述、截图或重新想象。复制并粘贴实际显示实际问题的实际代码。事实上如果“真实”代码太大,尝试创建一个仍然存在相同问题的小代码示例(这样,在询问其他人之前,您通常会发现诸如拼写错误之类的问题)。无法复制。使用上述定义编写模块并将其加载到GHCi中。至少,不会产生编译器错误。“我必须使用…”-这是什么意思?还有其他错误吗?您忘记了第一个是a
Hello
,第二个是a
bye
,反之亦然。谢谢大家。我提供了下面的链接以及我的代码和错误的屏幕截图。我用Notepadd++编写了类型和类型类,没有创建模块。此外,我欢迎对Haskell的任何学习建议。到目前为止,每天花两个小时在这本书上。还计划加入格拉斯哥大学未来课程网上课程。@ USER 2159411请不要张贴你的代码的描述、截图或重新想象。复制并粘贴实际显示实际问题的实际代码。事实上如果“真实”代码太大,尝试创建一个仍然存在相同问题的小代码示例(这样,在询问其他人之前,您通常会发现诸如拼写错误之类的问题)。谢谢Adam。我承认我的第二个问题是胡说八道,我不确定我错过了什么,那次我试了很多次。我又试了一次,结果成功了,但第一个问题仍然面临同样的问题。我拍摄了截图并提供了下面的链接。我用Notepad++编写了类型和类型类。我加载了没有EitherOr类型,它工作正常。我卸载了文件,添加了EitherOr,然后再次尝试加载。面对同样的错误,谢谢亚当。我承认我的第二个问题是胡说八道,我不确定我错过了什么,那次我试了很多次。我又试了一次,结果成功了,但第一个问题仍然面临同样的问题。我拍摄了截图并提供了下面的链接。我用Notepad++编写了类型和类型类。我加载了没有EitherOr类型,它工作正常。我卸载了文件,添加了EitherOr,然后再次尝试加载。面对同样的错误。