むむむむむむむ

Scala

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のケースを導きだせないと理解が出来てませんね。
精進が必要です。