(1 to 3).toList.foreach( println(_) ) は大丈夫なのにどうして (1 to 3).toSet.foreach( println(_) ) だとエラーがでるのか #scala
2012-06-07 13:30:14.@sqrns 定義が def toList: List[A] と def toSet[B >: A]: Set[B] なので後者だと println(_) という関数を作る際に型が決定できないからですね。.foreach(println) ならOKで、無駄な関数生成もされません
2012-06-07 13:52:45http://t.co/YKiBkaMA toListはListBuffer[A] ++=してtoList。toSetはimmutable.Set() ++。なんで型指定してないのかな。
2012-06-07 14:03:16(1 to 10).toSet[Any] は可能だけど (1 to 10).toList[Any] はできない・・・?両方immutableで共変なら、シグネチャ同じでいい気がするけど、なんでだろ。歴史的理由?
2012-06-07 14:13:35@kmizu immutable.Set[A]() ++ ...じゃないのはなんでかなと。toSetも[A]じゃ駄目な理由があるんでしょうか。
2012-06-07 17:05:07@kmizu 自分もこの違いの理由よくわからんですね https://t.co/F0v7GC5H なんでしょう・・・
2012-06-07 17:11:26@yasushia なるほど。逆に、toListの方も、[A]無し(new ListBuffer ++= ....)で動くはずなんですけど…。どうしてなんでしょうね。
2012-06-07 17:16:22@xuwei_k Setは共変ではないので、toSstの型パラメータとして明示的に親クラスの型を指定できる必要があります。しかしListは共変なので一旦List[A]を作ってからList[親クラス]にすればいいので型パラメータで指定する必要がありません。(続く
2012-06-07 17:54:12@xuwei_k 続き)toSetの型パラメータとして親クラスの型を指定できるようにした結果(1 to 10).toSet.map(_ + 1)の型が推論できなくなるというデメリットが生じているためtoListはそのようになっていないのだと思われます。
2012-06-07 17:56:29あっなるほど、 "(immutableな)Setが共変" っていうのが自分の勘違いか https://t.co/eBa7Hf4r
2012-06-07 17:57:39http://t.co/zdwoZnTU Why is Scala's immutable Set not covariant in its type?
2012-06-07 18:00:34@xuwei_k シグニチャ違う意図はわからんですね。lower bound付いてる奴(toIndexedSeq, toBuffer, toSet) と付いてないやつ (toTraversable, toList, toIterable, toSeq) 比べても…うーん。
2012-06-07 18:14:41@kmizu あっすいません解決しました https://t.co/OtCOFZkZ https://t.co/wICQZuTd https://t.co/vYQwctdZ
2012-06-07 18:17:22@kmizu @xuwei_k SetやBufferは共変でないのでいいとして、IndexedSeqが共変なのにtoIndexedSeqにboundがついてるのは謎だね。
2012-06-07 19:24:02.@cocoa_ruto さんのこのtweet https://t.co/q3eC7KOI 気になって、Scala2.9.2 で toIndexedSeq が定義されてるところを、とりあえず全部書き換えてビルドしてみたけどエラーになった https://t.co/gETgZzK9
2012-06-07 22:06:53っていうかわざわざbuildしなくても、master branchでは、5ヶ月も前にtype paramaterをとらないように修正されてる件(´・ω・`) https://t.co/55Ybi82T https://t.co/AsiNPP1f
2012-06-07 23:11:08