PureScriptの孤児

はじめに

PureScript Advent Calendar 2017 - Qiitaの6日目の記事です。

小ネタです。

Orphan instanceって何よ

以下のコードをみてください。

instance showUnit :: Show Unit where
  show _ = ""

ビルドしてみます。

  Type class instance showUnit for
                       
    Data.Show.Show Unit
                       
  is an orphan instance.
  An orphan instance is one which is defined in a module that is unrelated to either the class or the collection of data types that the instance is defined for.
  Consider moving the instance, if possible, or using a newtype wrapper.

これはOrphan instanceだ、と怒られていますね。

これは何かというと、インスタンス定義したモジュールが、型クラスを定義したモジュールでもなければ、インスタンスにしたいデータ型を定義したモジュールでもない場合のインスタンスを指しているようです。

Orphan instanceはPureScriptでは禁止されていて、コンパイルに失敗します。

確かにこの制約がない場合、どこで何のインスタンスが定義されているのかわけわからなくなりそうですね。定義が重複したりもしそうです。これを人間の脳で気をつけるのは大変そうです。

パッケージ提供者が型クラスを提供する場合は、必要なプリミティブ、また、その型クラスにおいてよく使用されるとみなせる型について、インスタンス定義をしておくと親切ということなのだろう。

こんな風に怒られたらどうするの?

エラーメッセージに書いてある通りですね。 「おまえはこういう理由でまちがっている」だけじゃなくて「こうしてくれ」まで書かれていました。

Consider moving the instance, if possible, or using a newtype wrapper

まとめ

人間同士の指摘も、「おまえはまちがっている」だけじゃなくて「おまえはこういう理由でまちがっているのでこうしてくれ」まで言えるとコミュニケーションコスト減ると思います。