プログラミング言語 Scala 7冊目
■ このスレッドは過去ログ倉庫に格納されています
0535(1) ◆CgacaMDhSQ
2011/11/27(日) 10:19:16.01おそらく、「より一般的な型を推論している」という言葉の使い方に齟齬があるかと思います
ここで、自分が「より一般的である」といっているのはメソッドシグニチャの包含関係がある
かどうかをさしています。
たとえば、次のfの推論と
(1) def f1(x: Int, y: Int): Int = x + y
以下の多相的なfの推論を比較したとき、
(2) def f2[T <: { def +(other: T): T }](x: T, y: T): X = x + y
(2)は(1)に比べて、「より一般的な型」を推論しているといえます。これは、
全ての式 x: X, y: Y について、f1(x, y) が型チェックを通るならば、f2(x, y) も型チェックを通るからです。
さて、次に
(3) def f3[T <: { def +[U >: T](other: U): U }](x: T, y: U) = x + y
と(2)を同様に比較してみます。結論から言うと、(2)では型チェックを通るが、(3)では
型チェックを通らない例が存在します。たとえば、x: Int, y: Intのとき、
f2(x, y) は 型チェックを通りますが、 f3(x, y) は型チェックを通りません。この理由は、必要であれば別のレスで述べますが、
ともあれそのような意味で、(3)は(2)より「一般的ではない」という事ができます。ここで、HM型システム
の元では、型付け可能な関数について、かならず「もっとも一般的な型」(principal typeと呼ばれます)
を推論することができる事が保証されており、推論結果の「正しさ」が保証されます。しかし、Scalaの
型システムではprincipal typeが存在しないので、そのような保証がありません。
■ このスレッドは過去ログ倉庫に格納されています