Scala

View/Context Bounds の制約

More than 5 years have passed since last update.


Advent Calendar を作る人に個人的に考えて欲しいこと


  1. コミュニティと相談する

  2. 私物化しない


View/Context Bounds の制約

わー遅刻だ遅刻だ。

View/Context Bounds は便利な型制約ですが、制約自身に制約があるというめんどくさいことになっています。

例えば以下のコードは formed です。

abstract class A[T : Manifest]

しかし以下のコードは ill-formed です。

trait A[T :  Manifest]

abstract member type を使っても ill-formed です。

trait A { type T : Manifest }

これは View/Context Bounds が実際にどのように実装されているかを考えれば理由は明白で、trait の場合 implicit parameter を置くべき場所がないためです。abstract class もダメそうに見えますが、abstract class の場合にはコンストラクタに implicit parameter が付くので大丈夫です。

  abstract class $read$$iw$$iw$A extends java.lang.Object with ScalaObject {

def this(implicit evidence$1: scala.reflect.Manifest): $line1.$read$$iw$$iw$A = {
$read$$iw$$iw$A.super.this();
()
}
};

まあ通常は型パラメタ使ってる場所で適当に implicit parameter 書けばいいわけです。そういうの嫌だっていう人は Scala 3 をお待ちください

というのは冗談で Scala 3 って言いたかっただけです。おしまい。

追記:invalid じゃなくて ill-formed なの?と思った人へ。本当に ill-formed です。Syntax として書けないことになっています。