apply in Scala

Scala をちょっと勉強中。こんなのが書けるそうです。

scala> val primes = List(2, 3, 5, 7)
primes: List[Int] = List(2, 3, 5, 7)

scala> primes(2)
res2: Int = 5

scala> primes(3)
res3: Int = 7

リストや配列へのアクセスが関数適用みたいな形で書ける。Arc にも似たような機能ありましたね。

Scala の場合は、

object(arg)

のように書くと

object.apply(arg)

と解釈されるらしいです。引数が複数あっても同じ。そしてリストや配列の apply メソッドはインデックスを受け取ってその位置を参照するので、上のように書けばインデックスを指定したアクセスになるのですね。

オブジェクトが関数でなくても、ともかく引数に「適用する」方法があればそれをやると。考えてみれば関数でなくても「適用らしきこと」が自然にできるものはたくさんあって、解釈が一意に決まるならそういうことが自由にできていいような気はしますね。

実は Arc のあの機能には違和感があったんですが、そもそも「関数適用」じゃないんだと思えばそんなに変な気もしなくなりそうです。