Scala の CanBuildFrom などについて

ブログ更新。 Stringを要素に持つ任意のコレクションにgrepを適用できるようにする - あるいはScalaの暗黒面について http://bit.ly/l3zFoL #scala
2011-07-02 09:03:00
ぐぬぬ、勉強になるな(´・ω・`)つまり自分はCanBuildFromをまだ完全に理解できてない的な… RT Stringを要素に持つ任意のコレクションにgrepを適用できるようにする - あるいはScalaの暗黒面について http://t.co/FvweOQC #scala
2011-07-02 11:49:54
今日のTODO: Scalaの CanBuildFrom について、 #scalajp_site のコラムに書く。 http://bit.ly/iDPUXY でも説明されているんだけど、 #scala
2011-07-02 13:17:49
デフォルトの状態で、 implicitなCanBuildFromのインスタンスがが一体「どっから湧いてくる」のかについての説明が不十分だと思う。 #scala
2011-07-02 13:19:50
CanBuildFrom 一見魔術目いてるけど、役割も仕組みも簡単なんだけどなあ。まあすくみずさんがなんか書くならいいか
2011-07-02 15:29:58
CanBuildFromの謎 http://bit.ly/kNeeHq にも書いたんだけど、多相的なimplicitな値の定義方法が以外と知られていないようなので、書いておく。(続く) #scala
2011-07-02 19:47:33
通常、implicitな値はimplicit objectまたはimplicit valによって定義するけど、implicit defでも定義できる。たとえば、 implicit def X: Int = 10 と書いたら、Int型のimplicitな値を定義したことになる。
2011-07-02 19:49:57
implicit def X = 2; のように書いた場合、毎回Xが呼び出されるので、その分のコストがかかるが、一方で、implicitな値を、随時計算できるというメリットがある。 #scala
2011-07-02 19:50:59
で、多相的なimplicitな値というのは、implicit def canBuildFrom[A]: CanBuildFrom[List[_], A, List[A]] = ... のようにして書く。そうすると、 (続く) #scala
2011-07-02 19:53:38
あらゆる型Aについて、CanBuildFrom[List[_], A, List[A]] 型の implicitな値が定義されたことになる(正確には、implicitな値を計算できる0引数メソッドだが)。 #scala
2011-07-02 19:55:05
もちろん、制約をかけることもできる。たとえば、型パラメータの上限境界/下限境界の指定による制約も可能だし、
2011-07-02 19:57:27
implicit def canBuildFrom[A](implicit req: Numeric[A]): CanBuildFrom[List[_], A, List[A]] = ... みたいにAについてNumeric[T]なimplicit parameterが
2011-07-02 19:57:53
CanBuildFromについては、元コレクション型から変換先の型への変換関数をオブジェクトにしてimplictで引き回せるようにしただけの仕組み、と理解してる
2011-07-02 20:00:10
これに関連した話として、implicit conversionは再帰できるという技もある。昔、型レ会で発表したころよりもわかりやすくしてみた。 http://bit.ly/mRsWtG #scala
2011-07-02 20:26:53
型レ会で発表したときは、Rep[T]型みたいなのを作ってたけど、あれ、今考えると要らなかった気がする。なんで入れてたんだろ。 #scala
2011-07-02 20:27:49
@nobsun また、それ以外の層(主にJavaユーザ)にとっても、サブタイピング(正確にはnominal subtyping)が無いのは困ると思います。でないと、Javaとの相互運用性がかなり下がるので。
2011-07-03 10:24:27
@nobsun 多相性についても、better Javaとしての実用的な静的型付け言語を目指す上では、必須だったと思います。
2011-07-03 10:26:56
@nobsun あとは型クラス(implicit parameter)や型コンストラクタ多相とかが必要だったか、ですが、これらは型システムを複雑にするので、別の形で同じような機能を提供するべきであった、かもしれません(それが何かはちょっとわかりませんが)。
2011-07-03 10:29:21
@kmizu 具体的な内容を理解していないので素朴なクエスチョンです.これは概念として複雑になるということですか?それとも利用する仕組みとして複雑になるとうこと? > 「これらは型システムを複雑にするので...」
2011-07-03 10:52:42
「言語の複雑さ」といっても、実は人くくりにできるものではなくて、 (1) ad hocに色々な機能を追加していった結果、プログラマが覚えるべき規則が非常に多数になってしまう場合
2011-07-03 11:22:39
(2) 機能の数はそれほど多く無いが(ので、覚えるべきルールの数もそれほど多く無い)、各機能の直交性が高いので、組み合わせることによって、複雑なことができてしまう場合
2011-07-03 11:24:29
この2つの場合に大別できると思う。厳密に言うと、2) のケースは、言語自体が複雑ではないのだけど、ルールを理解していない間は、複雑に「見えて」しまう。
2011-07-03 11:25:39