2016-05-08 5 views
3

私はHaskell Bookの「型クラス」の章の演習で忙しかった、と私は、次のようにそれを解決:私はGHCiのREPLでそれを使用できるようにtypeclassのインスタンスが間違って定義されていると、バックグラウンドで何が起こっていますか?

data TisAnInteger = 
    TisAn Integer 

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

が好き:

λ> 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の何も印刷していませんでした。

私は2つのことを理解しようとしています:

  1. を、なぜそれが苦情なしでコンパイルしますか?
  2. バックグラウンドでGHCiで何が起こっているのですが、何も印刷されません(少なくとも何秒間も)?無限ループなどに入るのですか? (私はghcのCPU使用率がその時間の間に90%以上になることがわかります)

私は上記の現象の理解を高めることができるように私のためのヒント、ドキュメントへのポインタなど?

+0

これはタイプメスとは関係ありませんか?あなたは '普通'の関数でも無限ループを作ることができます。 'foo x y = foo(x + 1)y' – immibis

答えて

9

無限ループに入るだけです。 (==) x yx == yと定義しています。これは... (==) x yに相当します。それはあなたがf(x) = f(x)と言ったかのようです。

関連する問題