Scala如何将列表视为函数?
假设我有一个int的列表,我可以在上面调用一个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 但是它是如何工作的呢?为什么我可以将提升(从部分功能特征)功能应用于列表?有什么隐含的魔力吗?没有“隐
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
的间隔
看
同样,对于映射,所有映射都扩展了traitMapLike
,它扩展了PartialFunction
。现在aMap[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
的间隔
看
同样,对于映射,所有映射都扩展了traitMapLike
,它扩展了PartialFunction
。现在aMap[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。是的,是真的。我说的是列表
。我在答案中添加了解释。