Scala 2.13.0-M4 からの新しいコレクションライブラリの変更

まだ色々未確定な情報が多い可能性ありますが、ひとまずtweetしたものをまとめました
2
Kenji Yoshida @xuwei_k

もともとScalaの標準ライブラリのコレクションを継承して独自クラス作るのは結構なアンチパターンだと思ってるけど、Scala 2.13で色々変わることにより、より一層アレなので “絶対Scala標準ライブラリのコレクション継承して独自クラス作るなよ” くらいに言っていきたい

2018-03-06 11:31:30
Kenji Yoshida @xuwei_k

github.com/rickynils/scal… 2.13の新しいコレクション、ライブラリ作者にとってはやはり、だいぶ面倒そうだな・・・ "org.scala-lang" %% "scala-collection-compat" は用意するらしいので、コードの変更は必要とはいえどうにかクロスビルドは可能なのか

2018-03-29 18:53:16
Kenji Yoshida @xuwei_k

というか、やはり依存が色々と循環してるし、しかも(ソースコードもバイナリも両方?)互換壊れるし、前も一時的にそうなったけど、これやはりscalacheckのcodeを一旦全部コピペしてscala/scala本体に入れないと厳しいのではないだろうか

2018-03-29 23:36:21
Kenji Yoshida @xuwei_k

Scala 2.13.x の開発用 branch を新しいコレクションライブラリにする(数万行に及ぶ大幅な)変更 merge されたのか github.com/scala/scala/pu…

2018-04-12 03:42:31
Kenji Yoshida @xuwei_k

gist.github.com/xuwei-k/b0d712… 2.13.0-M4-pre-20d3c21 という version が maven central においてあるので scalaz ビルド試してるけど予想通り厳しい

2018-04-12 13:01:48
Kenji Yoshida @xuwei_k

scalaz 以外でも、そりゃ結構な確率でそのままではビルド不可能だろうなぁ、やはり github.com/scala/communit…

2018-04-13 15:56:10
Kenji Yoshida @xuwei_k

現状の2.13のコレクションまとめ CanBuildFrom消える(似たような?BuildFromというの出来る) TraversableOnceとTraversableなくなる(IterableOnceやIterable使う) StreamがLazyListに名前変更 デフォルトのSeqやIndexedSeqが今までは"型は読み取り専用で実態は不変/可変の両方ありえた"のが不変に変更

2018-04-13 16:09:54
Kenji Yoshida @xuwei_k

もっと他にも色々ある(自分も全部把握してない)し、そもそも公式のアナウンスというかドキュメントで色々マイグレーションガイドや、scalafixのツールも提供される予定だろうし、あとは 2.13.0 の final 出るまでには細かい部分変わる可能性もゼロではないだろうけど、あくまで自分が見た範囲では

2018-04-13 16:12:24
Kenji Yoshida @xuwei_k

github.com/scalaz/scalaz/… 例えばMapに関して - SortedMapとMapの共通化諦める - 2.12以前と2.13の共通化あきらめる - 提供する機能そもそも減らす - 新しいコレクション完璧に理解してすべてを解決する仕組みを作る(かなり無理そうだし、無理してやっても維持がつらそう) という状況でどうやっても辛い

2018-04-17 23:25:11
Kenji Yoshida @xuwei_k

Scala 2.13 、今のところ、やはり scala.collection.breakOut を書き換えずに済む方法が無さそうなので、それ考えると今のうちから使わないようにしたほうがいい可能性がある、辛い

2018-04-17 23:27:28
Kenji Yoshida @xuwei_k

scalazでの2.13.0-M4(まだ出てないがそろそろ出そう)の新しいcollection対応試した限り、少なくともこれ github.com/scala/scala-co… の最初のversion(2.13.0-M4と同時にリリース?) が出てからではないと辛いが、出たらすぐ対応出来る部分だけでないどころか、そうでない部分のほうが多そうなので頭痛い

2018-04-17 23:32:39
Kenji Yoshida @xuwei_k

github.com/scala/scala/bl… Scala 2.13 から lastIndexOfSlice の end が length から length - 1 に仕様変更(?)されてるのなに

2018-04-18 19:28:50
Kenji Yoshida @xuwei_k

ArrayStack の += が完全に逆に追加されるようになった、という違いもある(それのほうが本来あるべき姿な気もするから、意図した仕様変更だろうか)

2018-04-18 19:29:48
Kenji Yoshida @xuwei_k

2.13 のソースコード中には github.com/scala/scala/bl… type CanBuildFrom[-From, -A, +C] = scala.collection.BuildFrom[From, A, C] となってるが、微妙に機能違うみたいなので、クロスビルドしようとすると、場合によっては邪魔でしか無いな、このalias。 つらい

2018-04-19 16:17:32
Kenji Yoshida @xuwei_k

scalaz 7.2 も 7.3 も Scala 2.13.0-M4-pre-20d3c21 に対応できる見込みたったが、今のうちから入れておくか、Scala 2.13.0-M4 が正式に出るまで待つべきか・・・?🤔 余計な変更に振り回される可能性はあるが、community-builds で検知可能になるし、publishすれば他のライブラリも試せるし、入れるか

2018-04-19 16:27:56
Kenji Yoshida @xuwei_k

github.com/scala/scala/bl… - CanBuildFrom に存在していた引数なしのapplyに相当するものがBuildFromではなくなってる - それはscala.collection.Factoryにある のでscala.collection.Factoryのほうをaliasにするべきかと一瞬思ったけどFactoryとBuildFromはどちらからも変換可能でもないのか、難しい

2018-04-19 16:55:40
Kenji Yoshida @xuwei_k

github.com/scala/scala-co… github.com/scala/scala-co… CanBuildFrom から BuildFrom も Factory も生成可能みたいなので、CanBuildFromの機能がBuildFromとFactoryに分割されたという理解で大体正しい気がするけど、それを理解したところで互換維持しつつクロスビルドする場合の問題はまた別なので難しい

2018-04-19 17:00:09
Kenji Yoshida @xuwei_k

新しく書き直したのに //TODO is uncheckedVariance sound here? というコメントあったり、そもそも uncheckedVariance それなりな量使われていて不安になるな github.com/scala/scala/bl…

2018-04-19 17:07:50
Kenji Yoshida @xuwei_k

Scala 2.13から加わるLazyList、単なるStreamの名前変えたものかと思いきやheadもlazyになったという動作の違いがあるらしく、単なるaliasではないのでdeprecatedなStreamは別実装として一旦残るらしい。しかし普通に2.12以前とcross buildするならStreamの非推奨の警告出たままにせざるを得ないし面倒

2018-04-24 12:30:56
Kenji Yoshida @xuwei_k

つまりこの説明微妙に嘘ついたような twitter.com/xuwei_k/status…

2018-04-24 12:31:51
ぽんこつ @ponkotuy

Iteratorに対してtoSeqしたときの挙動も変わるんですかね

2018-04-24 13:57:25
Kenji Yoshida @xuwei_k

@ponkotuy (今のところ) Listになるみたいです pic.twitter.com/QE7tpjBpVJ

2018-04-24 15:11:57
拡大
Kenji Yoshida @xuwei_k

Scala 2.13 の LazyList さん lazy val 2つ使うようになって Stream より余計にメモリ消費しそうだし、それとは別に、よくやりがちなメモリリーク起こしそうな実装になってるなぁ。あとでissue報告かpull reqするか

2018-04-24 17:15:43
リンク GitHub LazyList potentially memory leak? · Issue #10843 · scala/bug scala/scala@f84acc9 #7266 Should we change like this? --- a/src/library/scala/collection/immutable/LazyList.scala +++ b/src/library/scala/collection/immutable/LazyList.scala @@ -564,17 +564,17 @@ ...