当错误地定义类型类的实例时,后台发生了什么?

Emr*_*inç 4 haskell typeclass

我正忙着在Haskell Book的"Typeclasses"一章中练习,我解决了以下问题:

data TisAnInteger =
  TisAn Integer

instance Eq TisAnInteger where
  (==) (TisAn x) (TisAn y) = x == y
Run Code Online (Sandbox Code Playgroud)

这样我就可以在GHCi REPL中使用它了:

?> TisAn 9 == TisAn 9
True
?> TisAn 9 == TisAn 8
False
Run Code Online (Sandbox Code Playgroud)

但在玩它的同时问"怎么办?" 问题,我已经意识到以下编译:

data TisAnInteger =
  TisAn Integer

instance Eq TisAnInteger where
  (==) x y = x == y
Run Code Online (Sandbox Code Playgroud)

当我尝试在GHCi中运行类似的东西时:

?> TisAn 9 == TisAn 8
Interrupted.
?> TisAn 9 == TisAn 9
Interrupted.
Run Code Online (Sandbox Code Playgroud)

好吧,Interrupted.因为我Ctrl+C几秒钟后就打了,GHCi没有打印任何东西.

我想了解两件事:

  1. 为什么没有任何投诉就编译?
  2. GHCi在后台发生了什么,而根本没有打印(至少持续很多秒)?它是否进入无限循环等?(我可以看到在此期间ghc的CPU使用率超过90%)

对我来说有任何提示,指向文档等等,以便我可以加深对上述现象的理解吗?

ast*_*asr 9

它只是进入一个无限循环.要定义(==) x yx == y,这相当于... (==) x y.就像你说的那样f(x) = f(x).