Scala如何将列表视为函数?

时间:2016-04-16 15:22:03

标签: scala

假设我有一个int列表。我可以在其上调用lift函数,并获得另一个类型为T => Option[T]的函数。

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

但它是如何运作的?为什么我可以将lift(来自PartialFunction特征)功能应用于List?有一些隐含的魔法吗?

2 个答案:

答案 0 :(得分:5)

没有"隐含的魔法"。 List[T]只是PartialFunction[Int, T]

的子类

答案 1 :(得分:1)

如上所述,List[T]PartialFunction[Int, T]的子类型。现在List不是PartialFunction的直接子类。 它是以Seq形式扩展PartialFunction的{​​{1}}特征。

Seq是像trait Seq[+A] extends PartialFunction[Int, A]这样的集合继承的特征,后者又为它们提供List等方法。 我认为这是一个观点问题。

我会看一下,Lift是一个Seq,它从Int值到序列的元素类型,其PartialFunction方法返回isDefinedAt的间隔从true0

here

同样,对于地图,所有地图都会扩展延伸length的特征MapLike。现在PartialFunction扩展Map[A,B]。 因此,将Maps视为PartialFunctions,PartialFunction[A,B]方法为所有定义的isDefinedAt返回true

我正在从工作表中复制样本。我将keys分配给Map 说明相同。

PartialFunction

here