ヘルプ!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...で冒頭に続く。

追記:すいませんへろへろで適当に書いたので間違いまくってました。とりあえず対話環境そのまま貼り付け