Scala日記

Scalaの備忘録。ときどき研究の話。

ScalaのSeqやMapは関数である

Arrayに関数オブジェクトを突っ込んでいるときに、「Arrayだって数学的には写像なんだから、Array[A => B]Int => A => B だとみなせないのかな?」と思っていたら、ScalaSeqPertialFunctionトレイトを継承していることを発見。ちゃんと実現されていた。

つまり、こういうことができる。

gist.github.com

そもそも、Arrayの中に関数オブジェクトを入れたものに対して添字アクセスしていても、 見た目はカリー化された関数と変わらない。 こういうのを見ると、Scalaの添字アクセスが丸括弧なことに一層の美しさを感じる。 関数だとみなせるということは、mapメソッドに渡す事もできる。

gist.github.com

Seqは原理上インデックスしか定義域に取れないのでPertialFunction[Int, A]を継承している。 一方、Mapは定義域の型が自由なのでPertialFunction[A, B]を継承しており、 下のような感じで扱える。

gist.github.com

参考:

  1. qiita.com