toList: List[A] と toSet[B >: A]: Set[B] の違い

4
sqrns @sqrns

(1 to 3).toList.foreach( println(_) ) は大丈夫なのにどうして (1 to 3).toSet.foreach( println(_) ) だとエラーがでるのか #scala

2012-06-07 13:30:14
kxbmap @kxbmap

.@sqrns 定義が def toList: List[A] と def toSet[B >: A]: Set[B] なので後者だと println(_) という関数を作る際に型が決定できないからですね。.foreach(println) ならOKで、無駄な関数生成もされません

2012-06-07 13:52:45
Yasushi Abe @yasushia

http://t.co/YKiBkaMA toListはListBuffer[A] ++=してtoList。toSetはimmutable.Set() ++。なんで型指定してないのかな。

2012-06-07 14:03:16
Kenji Yoshida @xuwei_k

(1 to 10).toSet[Any] は可能だけど (1 to 10).toList[Any] はできない・・・?両方immutableで共変なら、シグネチャ同じでいい気がするけど、なんでだろ。歴史的理由?

2012-06-07 14:13:35
kmizu @kmizu

@yasushia 何故型指定していないか、とは?

2012-06-07 17:01:39
Yasushi Abe @yasushia

@kmizu immutable.Set[A]() ++ ...じゃないのはなんでかなと。toSetも[A]じゃ駄目な理由があるんでしょうか。

2012-06-07 17:05:07
Kenji Yoshida @xuwei_k

@kmizu 自分もこの違いの理由よくわからんですね https://t.co/F0v7GC5H なんでしょう・・・

2012-06-07 17:11:26
kmizu @kmizu

@yasushia なるほど。逆に、toListの方も、[A]無し(new ListBuffer ++= ....)で動くはずなんですけど…。どうしてなんでしょうね。

2012-06-07 17:16:22
ると @cocoa_ruto

@xuwei_k Setは共変ではないので、toSstの型パラメータとして明示的に親クラスの型を指定できる必要があります。しかしListは共変なので一旦List[A]を作ってからList[親クラス]にすればいいので型パラメータで指定する必要がありません。(続く

2012-06-07 17:54:12
ると @cocoa_ruto

@xuwei_k 続き)toSetの型パラメータとして親クラスの型を指定できるようにした結果(1 to 10).toSet.map(_ + 1)の型が推論できなくなるというデメリットが生じているためtoListはそのようになっていないのだと思われます。

2012-06-07 17:56:29
Kenji Yoshida @xuwei_k

あっなるほど、 "(immutableな)Setが共変" っていうのが自分の勘違いか https://t.co/eBa7Hf4r

2012-06-07 17:57:39
Kenji Yoshida @xuwei_k

http://t.co/zdwoZnTU Why is Scala's immutable Set not covariant in its type?

2012-06-07 18:00:34
Yasushi Abe @yasushia

おお。2年前の議論にやっと追い付いた…

2012-06-07 18:03:35
ると @cocoa_ruto

ちなみにSetが共変でないのはSet[A]はA=>Booleanでもあり、=>の第一型パラメータは反変だから。

2012-06-07 18:04:12
kmizu @kmizu

@xuwei_k シグニチャ違う意図はわからんですね。lower bound付いてる奴(toIndexedSeq, toBuffer, toSet) と付いてないやつ (toTraversable, toList, toIterable, toSeq) 比べても…うーん。

2012-06-07 18:14:41
ると @cocoa_ruto

@kmizu @xuwei_k SetやBufferは共変でないのでいいとして、IndexedSeqが共変なのにtoIndexedSeqにboundがついてるのは謎だね。

2012-06-07 19:24:02
Kenji Yoshida @xuwei_k

.@cocoa_ruto さんのこのtweet https://t.co/q3eC7KOI 気になって、Scala2.9.2 で toIndexedSeq が定義されてるところを、とりあえず全部書き換えてビルドしてみたけどエラーになった https://t.co/gETgZzK9

2012-06-07 22:06:53
ると @cocoa_ruto

@xuwei_k toIndexedSeq[A]ではなく、toIndexedSeqに変えないといけないのでは。

2012-06-07 22:36:40
Kenji Yoshida @xuwei_k

おぉ・・・なんて単純なミス(´・ω・`)

2012-06-07 22:38:19
Kenji Yoshida @xuwei_k

おっコンパイル通りそう

2012-06-07 23:04:49
Kenji Yoshida @xuwei_k

っていうかわざわざbuildしなくても、master branchでは、5ヶ月も前にtype paramaterをとらないように修正されてる件(´・ω・`) https://t.co/55Ybi82T https://t.co/AsiNPP1f

2012-06-07 23:11:08