S-JIS[2011-02-16] 変更履歴
コレクション(SeqやMap・Set)は関数になることが出来る。
(関数型の変数に代入することが出来る)
scala> val f: Int=>String = List("a","b","c") f: (Int) => String = List(a, b, c) scala> f(1) res0: String = b
scala> val f: Symbol=>Int = Map('a->123, 'b->456, 'c->789) f: (Symbol) => Int = Map(('a,123), ('b,456), ('c,789)) scala> f('b) res1: Int = 456
scala> val f: String=>Boolean = Set("abc", "def", "ghi") f: (String) => Boolean = Set(abc, def, ghi) scala> f("def") res2: Boolean = true
これらの関数を呼び出すと、それぞれのコレクションのapplyメソッドが呼ばれる。
なぜ関数型の変数に代入できるかと言うと、これらのコレクションは関数だから(爆)
えーと、もうちょっと分かりやすく言うと、関数型のトレイト(Function1)を継承しているから。
関数型を継承しているんだから、関数型の変数に代入できるのは当たり前。ということになる。
種類 | 定義 | 備考 |
---|---|---|
Seq |
trait Seq[+A] extends PartialFunction[Int, A] 〜 trait PartialFunction[-A, +B] extends (A)=>B |
Seqは、Intを引数に取りAを返す関数を継承している。 |
Map |
trait Map[A, +B] extends Iterable[(A, B)] with MapLike[〜] trait MapLike[〜] extends PartialFunction[A, B] 〜 trait PartialFunction[-A, +B] extends (A)=>B |
Mapは、Aを引数に取りBを返す関数を継承している。 |
Set |
trait Set[A] extends (A)=>Boolean 〜 |
Setは、Aを引数に取りBooleanを返す関数を継承している。 |