部分的ユニフィケーションを用いた型推論の強制 

EIP:

ここではいくつかのデータ型とそれに関連した強要関数 (coercion function)、 IdunIdConstunConst が出てくる。 読みやすくするために、これらの強要に共通する記法を導入する。

Scala の場合は implicit と型推論だけで結構いける。 だけど、型クラスを駆使していると Scala の型推論の弱点にも出くわすことがある。 中でも頻繁に遭遇するのは部分適用されたパラメータ型を推論できないという問題で、 SI-2712 として知られている。

今、これを読んでいるならば、そのページに飛んで投票を行うか、できれば問題を解決するのを手伝ってきてほしい。

これは Miles Sabin さんによって scala#5102 において、”-Ypartial-unification” フラグとして修正された。Explaining Miles’s Magic も参照してほしい。

以下は Daniel さんが用いた例だ:

scala> def foo[F[_], A](fa: F[A]): String = fa.toString
foo: [F[_], A](fa: F[A])String
scala> foo { x: Int => x * 2 }
res9: String = $$Lambda$7256/1737748869@6c35d915

上の例は以前はコンパイルしなかった。

コンパイルしない理由は Function1 が 2つのパラメータを受け取るのに対して、F[_] は 1つしかパラメータを取らないからだ。

-Ypartial-unification によってコンパイルするようになるが、コンパイラは型コンストラクタが左から右へと部分的に適用可能だという前提で推測を行うことに注意する必要がある。つまり、これは右バイアスのかかった Either のようなデータ型に恩恵があるが、左バイアスのかかったデータ型を使っていると間違った結果が得られる可能性がある。

Contents

猫番
    1. 部分的ユニフィケーションを用いた型推論の強制