ScalaのSeqやMapは関数である
Array
に関数オブジェクトを突っ込んでいるときに、「Arrayだって数学的には写像なんだから、Array[A => B]
をInt => A => B
だとみなせないのかな?」と思っていたら、ScalaのSeq
がPertialFunction
トレイトを継承していることを発見。ちゃんと実現されていた。
つまり、こういうことができる。
そもそも、Array
の中に関数オブジェクトを入れたものに対して添字アクセスしていても、
見た目はカリー化された関数と変わらない。
こういうのを見ると、Scalaの添字アクセスが丸括弧なことに一層の美しさを感じる。
関数だとみなせるということは、mapメソッドに渡す事もできる。
Seqは原理上インデックスしか定義域に取れないのでPertialFunction[Int, A]
を継承している。
一方、Mapは定義域の型が自由なのでPertialFunction[A, B]
を継承しており、
下のような感じで扱える。
参考: