ヘルプ!Scala はアイドル
追記:trunk では直っているようです http://groups.google.com/group/scala-language/browse_thread/thread/3652db621ae18cd5 まあでもメソッドのシグネチャはちゃんと書いたほうがいいよネ
グループではない。アイドルグループなのは Lisp(LISP) です。それは兎も角。
自分で調べようと思ったんですがなんかもうしんどいので…誰か助けてください。
trait A[T] { def t : T } trait B extends A[Int] def f[C[_] <: A[_]])(a : C[T]) = a f(new B { def t = 1 } : B) // ok f(new B { def t = 1 }) // ok def g[T, C[T] <: A[T]](a : C[T]) = a g(new B { def t = 1 } : B) // ok g(new B { def t = 1 }) // error
最後のエラーは何なのか。
type constructor に対する upper bound とはなんぞとか、type constructor を型パラメタに適用した結果に対する upper bound とはなんぞとか、その辺を調べればいいような気がするんですが…仕様と実装をぼんやり眺めていたんですが、何か今日は色々調子悪いので、もうアウトソーシングです。インターネットの皆さんで頑張ってください。
以下は事の発端というかなんというか。
配列をシャッフルしたいよ〜。
util.Random.shuffle(Array(1, 2, 3)) // error
あー Array が TraversableOnce じゃないのか。implicit conversion が定義されている ArrayOps なら TraversableOnce だけど shuffle の型パラメタに対する制約が view bounds じゃない…型コンストラクタに対しては view bounds 書けないんだっけ?仕方ないから view にでもしとこう。
util.Random.shuffle(Array(1, 2, 3).view) // error
ウソでしょ!?
view は TraversableLike が定義していて、このようになっている。
def view = new TraversableView[A, Repr] { protected lazy val underlying = self.repr override def foreach[U](f: A => U) = self foreach f }
メソッドのシグネチャが書かれていない。ワーオ。すると型は…?
java.lang.Object with scala.collection.mutable.IndexedSeqView[ Int,Array[Int] ]
oh...で冒頭に続く。
追記:すいませんへろへろで適当に書いたので間違いまくってました。とりあえず対話環境そのまま貼り付け。