S-JIS[2011-02-16] 変更履歴

Scala コレクション→関数

Scalaコレクションは関数になることが出来る。

 

コレクション→関数

コレクション(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を返す関数を継承している。

コレクションへ戻る / Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま