Scala の CanBuildFrom などについて

implicit conversionとかCanBuildFrom関係ないことも混ざってるけど気にするな。自分が入れたいものを入れただけです(・ω・`)ほんとtwitterやってるだけで勉強になりますね
2
kmizu @kmizu

ブログ更新。 Stringを要素に持つ任意のコレクションにgrepを適用できるようにする - あるいはScalaの暗黒面について http://bit.ly/l3zFoL #scala

2011-07-02 09:03:00
Kenji Yoshida @xuwei_k

ぐぬぬ、勉強になるな(´・ω・`)つまり自分はCanBuildFromをまだ完全に理解できてない的な… RT Stringを要素に持つ任意のコレクションにgrepを適用できるようにする - あるいはScalaの暗黒面について http://t.co/FvweOQC #scala

2011-07-02 11:49:54
kmizu @kmizu

今日のTODO: Scalaの CanBuildFrom について、 #scalajp_site のコラムに書く。 http://bit.ly/iDPUXY でも説明されているんだけど、 #scala

2011-07-02 13:17:49
kmizu @kmizu

デフォルトの状態で、 implicitなCanBuildFromのインスタンスがが一体「どっから湧いてくる」のかについての説明が不十分だと思う。 #scala

2011-07-02 13:19:50
Kenji Yoshida @xuwei_k

[壁]_・)チラッ <- CanBuildFrom

2011-07-02 13:31:12
病気の美少女 @lyrical_logical

CanBuildFrom 一見魔術目いてるけど、役割も仕組みも簡単なんだけどなあ。まあすくみずさんがなんか書くならいいか

2011-07-02 15:29:58
kmizu @kmizu

CanBuildFromの謎 http://bit.ly/kNeeHq にも書いたんだけど、多相的なimplicitな値の定義方法が以外と知られていないようなので、書いておく。(続く) #scala

2011-07-02 19:47:33
kmizu @kmizu

通常、implicitな値はimplicit objectまたはimplicit valによって定義するけど、implicit defでも定義できる。たとえば、 implicit def X: Int = 10 と書いたら、Int型のimplicitな値を定義したことになる。

2011-07-02 19:49:57
kmizu @kmizu

implicit def X = 2; のように書いた場合、毎回Xが呼び出されるので、その分のコストがかかるが、一方で、implicitな値を、随時計算できるというメリットがある。 #scala

2011-07-02 19:50:59
kmizu @kmizu

で、多相的なimplicitな値というのは、implicit def canBuildFrom[A]: CanBuildFrom[List[_], A, List[A]] = ... のようにして書く。そうすると、 (続く) #scala

2011-07-02 19:53:38
kmizu @kmizu

あらゆる型Aについて、CanBuildFrom[List[_], A, List[A]] 型の implicitな値が定義されたことになる(正確には、implicitな値を計算できる0引数メソッドだが)。 #scala

2011-07-02 19:55:05
kmizu @kmizu

もちろん、制約をかけることもできる。たとえば、型パラメータの上限境界/下限境界の指定による制約も可能だし、

2011-07-02 19:57:27
kmizu @kmizu

implicit def canBuildFrom[A](implicit req: Numeric[A]): CanBuildFrom[List[_], A, List[A]] = ... みたいにAについてNumeric[T]なimplicit parameterが

2011-07-02 19:57:53
kmizu @kmizu

無ければダメポ、とかいうのも書ける。

2011-07-02 19:58:06
しいたけ @yuroyoro

CanBuildFromについては、元コレクション型から変換先の型への変換関数をオブジェクトにしてimplictで引き回せるようにしただけの仕組み、と理解してる

2011-07-02 20:00:10
kmizu @kmizu

これに関連した話として、implicit conversionは再帰できるという技もある。昔、型レ会で発表したころよりもわかりやすくしてみた。 http://bit.ly/mRsWtG #scala

2011-07-02 20:26:53
kmizu @kmizu

型レ会で発表したときは、Rep[T]型みたいなのを作ってたけど、あれ、今考えると要らなかった気がする。なんで入れてたんだろ。 #scala

2011-07-02 20:27:49
Nobuo Yamashita @nobsun

@kmizu その複雑さはユーザーが望んだものではないのかしら?

2011-07-03 02:56:25
kmizu @kmizu

@nobsun また、それ以外の層(主にJavaユーザ)にとっても、サブタイピング(正確にはnominal subtyping)が無いのは困ると思います。でないと、Javaとの相互運用性がかなり下がるので。

2011-07-03 10:24:27
kmizu @kmizu

@nobsun 多相性についても、better Javaとしての実用的な静的型付け言語を目指す上では、必須だったと思います。

2011-07-03 10:26:56
kmizu @kmizu

@nobsun あとは型クラス(implicit parameter)や型コンストラクタ多相とかが必要だったか、ですが、これらは型システムを複雑にするので、別の形で同じような機能を提供するべきであった、かもしれません(それが何かはちょっとわかりませんが)。

2011-07-03 10:29:21
Nobuo Yamashita @nobsun

@kmizu 具体的な内容を理解していないので素朴なクエスチョンです.これは概念として複雑になるということですか?それとも利用する仕組みとして複雑になるとうこと? > 「これらは型システムを複雑にするので...」

2011-07-03 10:52:42
kmizu @kmizu

「言語の複雑さ」といっても、実は人くくりにできるものではなくて、 (1) ad hocに色々な機能を追加していった結果、プログラマが覚えるべき規則が非常に多数になってしまう場合

2011-07-03 11:22:39
kmizu @kmizu

(2) 機能の数はそれほど多く無いが(ので、覚えるべきルールの数もそれほど多く無い)、各機能の直交性が高いので、組み合わせることによって、複雑なことができてしまう場合

2011-07-03 11:24:29
kmizu @kmizu

この2つの場合に大別できると思う。厳密に言うと、2) のケースは、言語自体が複雑ではないのだけど、ルールを理解していない間は、複雑に「見えて」しまう。

2011-07-03 11:25:39
1 ・・ 4 次へ