リスト処理とか―Scala と C# と、時々、F#
そういう場合は、(限定継続使わないなら) Scalaでも Iterator を継承か、無名クラスで生成になるのかな・・・? http://t.co/8dvyFLm
2011-07-24 23:59:20@ufcpp 演算子が手厚ければ、シチュエーションの9割は組み合わせで何とかなりますからねw でも、残り1割のシチュエーションが消せるかといったらそうではないので、変わらず大切ではあるな、と。
2011-07-25 00:02:43@ufcpp なるほど。だとすると、こんな感じですか。 List(1, 1, 2, 2, 3, 3).view.flatMap{e => List(e, e)}.iterator
2011-07-24 23:59:18@ufcpp 外部イテレータが作りにくいと思われるものとして、二分木からIteratorを生成するプログラムも書いてみました。Iteratorを自前で実装する余地が全く出てこないのがポイントです。 http://bit.ly/nIuKRM #scalajp
2011-07-25 00:00:33@kmizu おお?これで、最終行、it.foreach じゃなくて、foreach ( x <- it) できます?
2011-07-25 00:11:15あー、C# でも、IObservableを返すメソッドを作って、Observable.ToEnumerable使えば機能的にはyield要らないなぁ。ちょっとした使い勝手とか、効率とか考えるとやっぱりyield欲しいけど。
2011-07-25 00:14:16@ufcpp 仕掛けとしては、ScalaではほぼあらゆるコレクションをIteratorにiteratorメソッドで変換できるので、Streamで遅延リストを作っておいて、最後にIteratorに変換するといった感じです。 #scalajp
2011-07-25 00:24:56@kmizu 「Streamでできるよ」というのは他の方のコメントでもあったんですけども。ただ、見てる感じ、それも記事の趣旨からはずれている感がありますねぇ。
2011-07-25 00:30:54@ufcpp 記事の趣旨からはずれている、というのはその通りかもしれません。ただ、Scalaとかの関数型かつ遅延データ構造を標準で持ってる言語だと、普通の制御フローからIteratorを生成する機能の需要というのは相対的にかなり少ないと思います。 #scalajp
2011-07-25 00:40:03この、「再帰的に辿るもの」のケースでは、ScalaだとStreamとかで書いちゃうので、yieldの出番が無いわけか。繰り返し条件が変則的でも、特に問題は無いし。欲しいとしたら、繰り返しの間に副作用を起こしたい場合くらい? #scalajp
2011-07-25 00:43:34