Scala如何将列表视为函数?

Scala如何将列表视为函数?,scala,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 但是它是如何工作的呢?为什么我可以将提升(从部分功能特征)功能应用于列表?有什么隐含的魔力吗?没有“隐

假设我有一个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

但是它是如何工作的呢?为什么我可以将
提升
(从
部分功能
特征)功能应用于
列表
?有什么隐含的魔力吗?

没有“隐含的魔力”
List[T]
只是
PartialFunction[Int,T]

的一个子类,没有“隐式魔法”
List[T]
只是
PartialFunction[Int,T]
的一个子类,正如前面提到的
List[T]
PartialFunction[Int,T]
的一个子类型。现在,
List
不是
PartialFunction
的直接子类。 是
Seq
trait扩展了
PartialFunction
,形式为
trait Seq[+A]扩展了PartialFunction[Int,A]

Seq是像
List
这样的集合所继承的特性,它反过来又为它们提供了
Lift
等方法。 我认为这是一个观点问题

我将其视为
Seq
是一个
PartialFunction
,它从Int值到序列的元素类型,其
isDefinedAt
方法返回
true
0
length
的间隔

同样,对于映射,所有映射都扩展了trait
MapLike
,它扩展了
PartialFunction
。现在a
Map[a,B]
扩展了
PartialFunction[a,B]
。 因此,可以将映射视为partialfunction,其中
isDefinedAt
方法为所有定义的
键返回
true

我正在从工作表中复制一个样本。我将
Map
分配给
PartialFunction
为了说明相同之处

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

看。

如前所述,
List[T]
PartialFunction[Int,T]
的一个子类型。现在,
List
不是
PartialFunction
的直接子类。 是
Seq
trait扩展了
PartialFunction
,形式为
trait Seq[+A]扩展了PartialFunction[Int,A]

Seq是像
List
这样的集合所继承的特性,它反过来又为它们提供了
Lift
等方法。 我认为这是一个观点问题

我将其视为
Seq
是一个
PartialFunction
,它从Int值到序列的元素类型,其
isDefinedAt
方法返回
true
0
length
的间隔

同样,对于映射,所有映射都扩展了trait
MapLike
,它扩展了
PartialFunction
。现在a
Map[a,B]
扩展了
PartialFunction[a,B]
。 因此,可以将映射视为partialfunction,其中
isDefinedAt
方法为所有定义的
键返回
true

我正在从工作表中复制一个样本。我将
Map
分配给
PartialFunction
为了说明相同之处

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

看。

阅读此:阅读此:我认为此行为与所有集合API相关。例如,我们还可以将映射视为一个函数:
map(1->1).isDefinedAt(1)
。然而,Map不是索引Seq。是的,是真的。我说的是
列表
。我在回答中添加了解释。我认为这种行为与所有集合API有关。例如,我们还可以将映射视为一个函数:
map(1->1).isDefinedAt(1)
。然而,Map不是索引Seq。是的,是真的。我说的是
列表
。我在答案中添加了解释。