2016-04-16 7 views
0

intのリストがあるとします。 lift関数を呼び出して、T => Option[T]という別の関数を呼び出すことができます。Scalaはリストを関数としてどのように扱いますか?

val f0: Int => Option[Int] = List(1, 2).lift 

println(f0.apply(0)) // Some(1) 
println(f0.apply(1)) // Some(2) 
println(f0.apply(2)) // None 

しかし、どのように機能しますか?なぜliftPartialFunction形質)機能をListに適用できますか?暗黙の魔法がありますか?

+2

はこれを読む:http://www.alessandrolacava.com/blog/scala-seq-map-and-set-as-functions/ –

+0

リンクいただきありがとうございます。 – barbara

答えて

1

List[T]はサブタイプPartialFunction[Int, T]である。今すぐListPartialFunctionの直接のサブクラスではありません。 PartialFunctionの形をしたSeqの形はtrait Seq[+A] extends PartialFunction[Int, A]です。

Seqは、Listのようなコレクションによって継承された特性であり、Liftなどのメソッドを返します。 私はそれを遠近法の問題と考える。

IはSeqとしてその時になり配列の要素型に値のIntから進み、そのisDefinedAt方法lengthまで0から間隔のtrueを返すPartialFunctionあります。

ルックhere

マップの場合と同様に、すべてのマップはPartialFunctionを拡張する形容詞MapLikeを拡張します。今すぐMap[A,B]PartialFunction[A,B]になります。 isDefinedAtメソッドがを返す部分関数としてマップを定義すると、すべてkeysと定義されます。

私はワークシートからサンプルをコピーしています。私はMapPartialFunction に割り当て、同じことを示します。

val m = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4) 
                //> m : scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2, c -> 3 
                //| , d -> 4) 
    val f2: PartialFunction[String, Int] = m  //> f2 : PartialFunction[String,Int] = Map(a -> 1, b -> 2, c -> 3, d -> 4) 


    m.isDefinedAt("d")        //> res5: Boolean = true 
    f2.isDefinedAt("e")        //> res6: Boolean = false 

ルックhereをご覧ください。

+0

私はこの動作がすべてのコレクションAPIに関連していると思います。 .isDefinedAt(1) ' - '地図(> 1 1):例えば、我々はまた、関数としてマップを扱うことができます。しかし地図はインデックス付きの配列ではありません。 – barbara

+0

はい。私は 'List'について話していた。 –

+0

答えに説明が追加されました。 –

5

"暗黙の魔法"はありません。 List[T]は、単にPartialFunction[Int, T]のサブクラスである。

関連する問題