Advent Calendar を作る人に個人的に考えて欲しいこと
- コミュニティと相談する
- 私物化しない
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 として書けないことになっています。