Scala中有高阶函数,据我了解,这些函数要么返回函数,要么接受函数。
例如,这是将函数从Int转换为Int的高阶函数:
def highOrderFunc(f: Int => Int) = {
???
}
为什么我用List(1,2,3)
调用highOrderFunc时会编译?从这个签名我虽然我需要传递一个函数...我在这里很困惑,有人可以解释一下吗?
答案 0 :(得分:3)
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]
是List[Int]
的父母
这就是为什么您可以将List[Int]
用作Function1[Int, Int]
或Int => Int
答案 1 :(得分:2)
这是有效的,因为List(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)