Scala高阶函数
在Scala中有高阶函数,据我所知,它们要么返回函数,要么接受函数 例如,这是一个从Int到Int的高阶函数:Scala高阶函数,scala,Scala,在Scala中有高阶函数,据我所知,它们要么返回函数,要么接受函数 例如,这是一个从Int到Int的高阶函数: def highOrderFunc(f: Int => Int) = { ??? } 为什么我用List(1,2,3)调用highOrderFunc时它会编译?从这个签名我想我需要传递一个函数…我在这里感到困惑,有人能解释一下吗 List[A]扩展了Seq[A],它还扩展了PartialFunction[Int,A]: trait Seq[+A] extends Part
def highOrderFunc(f: Int => Int) = {
???
}
为什么我用
List(1,2,3)
调用highOrderFunc时它会编译?从这个签名我想我需要传递一个函数…我在这里感到困惑,有人能解释一下吗 List[A]
扩展了Seq[A]
,它还扩展了PartialFunction[Int,A]
:
trait Seq[+A] extends PartialFunction[Int, A]
with Iterable[A]
with GenSeq[A]
with GenericTraversableTemplate[A, Seq]
with SeqLike[A, Seq[A]]
而PartialFunction[Int,A]
扩展了Function1[A,B]
或(A=>B)
。在您的例子中,A
是Int
,因此Int=>Int
是PartialFunction[Int,Int]
的父项,它是Seq[Int]
的父项,Seq[Int]是List[Int]
的父项
这就是为什么可以将
List[Int]
作为Function1[Int,Int]
或Int=>Int
传递,因为列表(1,2,3)
扩展了Int=>Int
。在类层次结构的某个位置,List
扩展了Function1
(=>
语法背后的实际特征,就是语法)。试试看,它将是从索引到元素的部分函数
@ val f : Int => Int = List(1, 2, 3)
f: Int => Int = List(1, 2, 3)
@ f(2)
res6: Int = 3
@ f(5)
java.lang.IndexOutOfBoundsException: 5
scala.collection.LinearSeqOptimized.apply(LinearSeqOptimized.scala:63)
scala.collection.LinearSeqOptimized.apply$(LinearSeqOptimized.scala:61)
scala.collection.immutable.List.apply(List.scala:86)
scala.collection.immutable.List.apply(List.scala:86)
scala.Function1.apply$mcII$sp(Function1.scala:36)
scala.Function1.apply$mcII$sp$(Function1.scala:36)
scala.collection.AbstractSeq.apply$mcII$sp(Seq.scala:41)
ammonite.$sess.cmd7$.<init>(cmd7.sc:1)
ammonite.$sess.cmd7$.<clinit>(cmd7.sc)
@val f:Int=>Int=List(1,2,3)
f:Int=>Int=List(1,2,3)
@f(2)
res6:Int=3
@f(5)
java.lang.IndexOutOfBoundsException:5
scala.collection.LinearSeqOptimized.apply(LinearSeqOptimized.scala:63)
scala.collection.LinearSeqOptimized.apply$(LinearSeqOptimized.scala:61)
scala.collection.immutable.List.apply(List.scala:86)
scala.collection.immutable.List.apply(List.scala:86)
scala.Function1.apply$mcII$sp(Function1.scala:36)
scala.Function1.apply$mcII$sp$(Function1.scala:36)
scala.collection.AbstractSeq.apply$mcII$sp(Seq.scala:41)
菊石$sess.cmd7$(cmd7.sc:1)
菊石$sess.cmd7$(cmd7.sc)
那就得小心了。这大概是对Seq
的一个有意识的设计决定,而不是集合层次结构的一个不需要的人工制品?根据它可能是为了方便起见,因为方法当我们通过索引获得元素时,如someList(1)
或someSeq(1)
这是有意的,和一个有用的功能。列表只是从索引到值的映射。它的apply方法接收索引,并返回一个值。从语法上讲,doThing(1)可能是一个列表索引或一个函数调用,实际上不应该有任何理由在意。在这两种情况下,我们传入一个int并得到一些结果。