むむむむむむむ
scala> def mystery(lst : List[Int]) = | (List[Int]() /: lst) ((x, y) => if (y % 2 == 0) x else x + y) warning: there were deprecation warnings; re-run with -deprecation for details mystery: (List[Int])List[Int] scala> mystery(List(1,2,3,4,5)) res32: List[Int] = List(1, 3, 5)
うーん、挙動的には、xの評価はなしで、単純にy % 2 == 0が偽の要素だけ返してるという感じなんですけど。なんでこうなるのか?
Rubyでいえばrejectみたいな。感じにみえるけどそんなわきゃあないよね。
#舌っ足らずだったので補足しました。
>> [1,2,3,4,5].reject {|x| x % 2 == 0 } => [1, 3, 5]
おまけ
#ymnkさんより
scala> List(1, 2, 3, 4, 5).filter(_%2!=0) res3: List[Int] = List(1, 3, 5)
これがポイント?
List[Int]()
scala> val list=List[Int]() list: List[Int] = List() scala> list(0) java.util.NoSuchElementException: head of empty list at scala.Nil$.head(List.scala:1358) at scala.Nil$.head(List.scala:1355) at scala.List.apply(List.scala:793) at .<init>(<console>:6) at .<clinit>(<console>) at RequestResult$.<init>(<console>:3) at RequestResult$.<clinit>(<console>) at RequestResult$result(<console>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Met...
展開された時のイメージが湧かない。
追記:かなり恥ずかしい思いこみをしていた事が原因でした。
List[Int]()
要素が空のInt型のリストですね。
これをなぜか、リストの要素へのアクセスと思いこみ、indexも入ってないしなんじゃこりゃとなってました。
//こういうのかと List(17, 29)(1) //is 29
文法もおぼつかないとはかなり恥ずかしいですね。うーむ。
と、いうわけで、Rubyの場合
#とおりすがりさん
>> (1..5).inject([]) {|x,y| if y % 2 == 0 then x else x << y end} => [1, 3, 5]
ありがとうございますm(__)m
Rubyだったらどうかと比較しながらやってる感じなので、今回みたいに読み解きそこなったりして、Rubyのケースを導きだせないと理解が出来てませんね。
精進が必要です。