2

重複の可能性:
クラスインスタンスがループの場合、GHCは警告できますか?

相互に実装可能な2つのメソッドを持つ型クラスについて考えてみます。

class Num a => Foo a where

  foo :: a

  bar :: a -> a
  bar x = baz x + 1

  baz :: a -> a
  baz x = bar x - 1

タイプによっては、実装が簡単な場合もbarあれbazば、効率上の理由から両方の実装を提供したい場合もあります。

今、私はどこかに行き、このクラスのインスタンスを作成します

instance Foo Integer where
  foo = 1

おっと、またはのいずれかを実装するのを忘れました!気にしないでください、型システムは私のためにそれを拾いますね?barbaz

C:\path\to\file> ghci Foo.hs
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( Foo.hs, interpreted )
Ok, modules loaded: Main.

うーん、どうやらそうではない。今、クラスを使おうとすると

*Main> bar 1
<interactive>: out of memory

ええとああ。面倒なデバッグのキュー時間。

各インスタンスがまたはの少なくとも1つを指定する必要があることをGHCに通知する方法はありますbarbaz

4

1 に答える 1

5

残念ながら違います。デフォルトで型クラスを定義するほとんどのライブラリは「最小限の完全な定義」を指定しますが、現時点ではチェック可能な方法でGHCにそれを指定していません。このためのプラグマを実装するという漠然とした話がありましたが、私が知る限り、深刻なことは何もありません。

相互再帰をチェックするだけでは不十分であることに注意してください。相互再帰的なデフォルトのメソッドは、完全に有効である可能性がありsomeます。manyAlternative

于 2012-10-31T09:02:37.837 に答える