リスト処理とか―Scala と C# と、時々、F#

「C#/Scala/Python/Ruby/F#でデータ処理はどう違うのか? - @IThttp://bit.ly/o6XEmV を基点とした、主に Scala 限定継続に関するお話とか。 ※@xuwei_k さんによる同件についての別のまとめが http://togetter.com/li/164658 とか http://togetter.com/li/165637 にあります。
17
ぐるぐる系SQL @bleis

Scalaの「パイプライン化」がトレイトって、どういう意味だろう? http://www.atmarkit.co.jp/fdotnet/chushin/comparedataproc_01/comparedataproc_01_01.html

2011-07-22 16:38:27
++C++; // 管理人: 岩永 @ufcpp

@bleis 基本的に、欲しいのはインターフェイスに対するアルゴリズムの後置きメソッド記法になるはずです。トレイト=実装を持てる(メンバー関数を持てる)インターフェイスという扱いです。

2011-07-22 16:39:51
ぐるぐる系SQL @bleis

@ufcpp どちらかと言うと、implicit conversionじゃないですかね

2011-07-22 16:41:07
ぐるぐる系SQL @bleis

@ufcpp あと集計ですけど、AggregateとscanLeftとreduceって、かなりバラバラな気がします。Aggregate/foldLeft/foldの方がいいんじゃ?

2011-07-22 16:41:56
++C++; // 管理人: 岩永 @ufcpp

@bleis まあ、脚注に入ってますけども、トレイト+implicitですねぇ(まあ、個人的にimplicit conversionはクソ仕様だと思っていますが)。LINQに直接対応するのはIterableのmapとかですし。

2011-07-22 16:44:13
ぐるぐる系SQL @bleis

@ufcpp トレイトであることは必須ではなくて、クラスでもできますよね。なので、クラス/トレイト + implicit conversionかなー

2011-07-22 16:45:24
++C++; // 管理人: 岩永 @ufcpp

@bleis まあ、それはC# の拡張メソッドでも同じなんですが<クラスでもできる。が、LINQなんかを見ての通り、一番ありがたいのはインターフェイスに対する実装の追加という部分になります。機能ベースでなく、目的ベースで言うと。

2011-07-22 16:47:58
ぐるぐる系SQL @bleis

@ufcpp んー、そこらへんはScalaだと、implicit conversion用のメソッドを用意するので、インターフェイス(トレイト)に対する実装の追加というのはimplicit conversion用のメソッドの引数側の話で、戻り値の型側の話ではないのでは?

2011-07-22 16:49:39
++C++; // 管理人: 岩永 @ufcpp

@bleis 機能としてはインターフェイスが実装を持つ(トレイト)というのと、実装を後から追加する(暗黙型変換)というのがありますけども。どっちかというとそういう機能的な話ではなくて、データ処理、パイプライン型のコーディングという目的で見てるので。

2011-07-22 16:54:12
++C++; // 管理人: 岩永 @ufcpp

@bleis Iterableにmapやfilterを付けるとして、じゃあ、それはどうしようと。Scala標準のはトレイトに実装与えてますけども、もちろん、暗黙型変換でやってもよかったと思いますよ。

2011-07-22 16:55:28
ぐるぐる系SQL @bleis

ScalaとかF#にイテレータ・ブロックとかジェネレータ的なものがないのは、イミュータブルなコレクションが手厚いから不要という説

2011-07-22 16:52:02
++C++; // 管理人: 岩永 @ufcpp

@bleis いや、F# はシーケンス式(ブロックの必要なくて、式がそもそも制御構文持てる)があるじゃないですか。

2011-07-22 16:58:34
ぐるぐる系SQL @bleis

@ufcpp C#のyieldって、独自のコレクション的なクラスを作る時にも使うので、その観点で見るとそもそもクラス作る必要がない、とかそんな感じです

2011-07-22 17:02:57
++C++; // 管理人: 岩永 @ufcpp

@bleis うーん、ただ、mapとかfilterを作るのにもyieldは必要なはずで。そして、mapやfilterは特定のコレクションの実装であってはいけなくて、IEnumerableみたいなインターフェイスに対する実装でなければいけないはず。

2011-07-22 17:06:06
++C++; // 管理人: 岩永 @ufcpp

@bleis ScalaやF# は標準ライブラリの中で頑張ってるから、コレクション利用者が必要としないという意味では正しいです<yield。が、じゃあ、標準にないコレクション操作が全くない、将来にわかっても標準で十分かというと、そうでもないはずです。

2011-07-22 17:07:54
ぐるぐる系SQL @bleis

@ufcpp そういうものがすでに用意されているので、C#的なyieldの出番が少ないよね、ということです

2011-07-22 17:10:47
ぐるぐる系SQL @bleis

@ufcpp 足りないものは、基本的には現状のものの組み合わせでできるので、あれば便利だけどなくても問題はないかなー

2011-07-22 17:11:32
++C++; // 管理人: 岩永 @ufcpp

@bleis それをいうと、C# でも出番少ないんですよ。LINQでほぼそろうので。が、出番が0ではない&不要というのは利用者視点過ぎるかなと。

2011-07-22 17:15:19
ぐるぐる系SQL @bleis

@ufcpp あと、最初のテーブルですけど、ScalaにはgroupByありますし、scanLeftじゃなくてfoldLeftです。

2011-07-22 17:14:01
ぐるぐる系SQL @bleis

@ufcpp Scala2.9から限定継続があるので、イテレータブロック的なものも実現可能です

2011-07-22 17:15:18
Kenji Yoshida @xuwei_k

2.8からでは?(´・ω・`) RT @bleis Scala2.9から限定継続があるので、イテレータブロック的なものも実現可能です

2011-07-22 17:21:03
++C++; // 管理人: 岩永 @ufcpp

@bleis うーん、情報が少ない…<限定継続。今回のは2.7ベースで書いてるものの、情報あれば書いてましたねぇ。foldLeftのは修正依頼を出しておきます。

2011-07-22 17:24:47
ぐるぐる系SQL @bleis

@ufcpp あー、2.7でしたか・・・バージョンを明記しておいた方がいいかもしれませんね

2011-07-22 17:25:50
1 ・・ 6 次へ