在Scala中有一些高阶函数,据我所知,这些函数要么是返回函数,要么是接受函数。
例如,这是从Int到Int的函数的高阶函数:
def highOrderFunc(f: Int => Int) = {
???
}为什么当我用List(1,2,3)调用highOrderFunc时它会编译?从这个签名我想我需要传递一个混淆在这里的function...im,有人能解释一下吗?
发布于 2018-07-02 23:41:28
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进行传递
发布于 2018-07-02 23:42:02
这是因为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)https://stackoverflow.com/questions/51139385
复制相似问题