Subscribed unsubscribe Subscribe Subscribe

Orphan instances

Haskell

Haskellのorphan instanceが何者なのか、その意味するところをちゃんと理解してなかったので調べてみた。

  • orphan instancesとは何?
    • 型クラスの定義ともデータ型の定義とも異なるモジュールで定義されたインスタンス宣言のこと
    • 例: T.hsで定義されたデータ型Tについて、モジュールM.hsでinstance Show Tとインスタンス宣言されていたら、それはorphan instance。
      • このインスタンス宣言は、型クラスShowともデータ型Tとも異なるモジュールで宣言されているから。
  • orphan instancesはいいもん?わるもん?
    • ケースバイケース
    • 前提: Haskell 98では重複した*1インスタンス宣言を扱えない。
    • 利点: ケースによってインスタンス宣言を差し替えられるように、複数のインスタンスを定義したい場合は、別モジュールに定義する(つまりorphan instances)しかない。
    • 欠点: 逆に言うと、orphan instancesを許すと意図せずインスタンスが重複してしまう可能性があるということ。

関連する話題も書いておくと、複数のインスタンス宣言が必要になったときの代表的な対処法は2つある。

*1:型クラスとデータ型のペアが同じということ