Scala の CanBuildFrom などについて
戻り値の具体的なインスタンスはコンテキスト(mapならその時適用した変換関数)によって変わるので、コンテキストにあわせて戻り値型を生成できるようにする必要がある。って点が抜け落ちてましたね。ご指摘多謝 #scala
2011-07-03 20:36:26@gakuzzzz その通りですね。「戻り値同型の原則」を実現するだけなら、CanBuildFromとかは要らないです。昔(2.7.X)の頃はそういう風にDRYじゃないことやってたわけで、その辺りは知っています。って私に対するツッコミでなければすいません。 #scalajp
2011-07-03 20:50:02コンテキストを読み違えてたらアレなのですが、 http://bit.ly/l3zFoL の補足に対するツッコミですよね。たぶん。 #scalajp
2011-07-03 20:55:06@kmizu あ、いえいえ、ツッコミというよりkmizuさんの記事等を読んで自分の中の考えを整理してた感じです。更に補足や指摘を頂いて噛み砕いてる最中です!
2011-07-03 20:55:49あれは、「Pimp my libraryでgrepとかみたいなのを追加する」という目的において、「戻り値同型」の原則を遵守しようとするなら、ややこしいことを知る必要があるよね、という趣旨で、 #scalajp
2011-07-03 20:58:14CanBuildFrom自体の役割については、 @lyrical_logical さんや @gakuzzzz さんのおっしゃる事で合っています。 #scalajp
2011-07-03 20:59:38これからの発言内容は、TLの全容知らずに言うことで、全く他意はないです。強いて言えば、「戻り値同型の原則」の出典が知りたいのです。
2011-07-03 21:06:01// 実は、戻り値同型じゃない。 scala> Map(1 -> 'kiritshubo, 2 -> 'hahakigi) map {_._2} toString res1: String = List('kiritshubo, 'hahakigi)
2011-07-03 21:06:23ちなみに、動的型は List でしたが、静的型は Iterabale[Symbol] です。いずれにせよ、コレクションが同型ではないです。
2011-07-03 21:07:33「Pimp my libraryでgrepとかみたいなのを追加する」とい う目的において「ややこしいことを知りたくない!」という場合は戻り値型を型推論に任せちゃうというのも。再帰的なのには使えませんが https://gist.github.com/1062188 #scala
2011-07-03 21:08:13このように同型でないでことは、2,8 collection library の説明に書かれている(むしろ同型の制約を撤廃するところに力点が置かれているようにも読める)のですが、どういうふうに理解すればいいでしょうね。(同型でないけれど、非同型ではなく構成的な説明が欲しい)
2011-07-03 21:10:00"same-result-type" principle http://t.co/RqziePC http://t.co/nJ63Cq9 #scala
2011-07-03 21:12:00@xuwei_k parser combinator等がが典型例なのですが、メンバとしてimplicit conversionを持てるおかげで、色々アレゲなことができるのが利点の一つではあります。 #scala
2011-07-03 21:12:43「戻り値同型」の原則 ("same-result-type" principle) の出典は http://eed3si9n.github.com/scala-collections-impl-doc-ja/collections-impl_2.html これですかね?
2011-07-03 21:13:13「CanBuildFromの謎」 http://bit.ly/kcWVZq は「CanBuildFromのインスタンスはどこから湧いてくるのか」にした方が良かったかもと反省。 #scalajp
2011-07-03 21:15:30コラム自体にも書いたのですが、本題は、implicitなCanBuildFromのインスタンスって一体どこにあるのよ?という疑問に対する解を提供することだったので、CanBuildFromの説明はかなりはしょっています。 #scalajp_site
2011-07-03 21:16:52.@gakuzzzz ありがとうございます。戻り値同型("same-result-type" principle)を目指すけれど、要素型が変わるなどして同しようもない場合(例えば 別の型への map など)は仕方ないという感じなんですね。スッキリしました。
2011-07-03 21:17:04filter などは「戻り値同型」の原則に従っていて、それを実現するために newBuilder/foreach フレームワーク を使っていて、 map等に関しては「戻り値同型」の原則よりさらに柔軟な法則を適用する必要があるので Conceptパターンで実現した。 #scala
2011-07-03 21:19:27