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

时间:2016-05-08 19:27:17

标签: haskell typeclass

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

data TisAnInteger =
  TisAn Integer

instance Eq TisAnInteger where
  (==) (TisAn x) (TisAn y) = x == y

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

λ> TisAn 9 == TisAn 9
True
λ> TisAn 9 == TisAn 8
False

但是在玩它的同时并且问"如果是什么?"问题,我已经意识到以下编译:

data TisAnInteger =
  TisAn Integer

instance Eq TisAnInteger where
  (==) x y = x == y

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

λ> TisAn 9 == TisAn 8
Interrupted.
λ> TisAn 9 == TisAn 9
Interrupted.

Interrupted.因为我在几秒钟之后点击Ctrl+C,GHCi没有打印任何内容。

我试图理解两件事:

  1. 为什么没有任何投诉就编译?
  2. GHCi在后台发生了什么,而根本没有打印(至少持续很多秒)?它是否进入无限循环等? (我可以看到ghc的CPU使用率在那段时间内超过90%)
  3. 对我来说,任何提示,指向文档等等,以便我能加深对上述现象的理解?

1 个答案:

答案 0 :(得分:9)

它只是进入一个无限循环。您将(==) x y定义为x == y,相当于...... (==) x y。好像你已经说过f(x) = f(x)