Scala高阶函数混乱

时间:2018-07-02 15:25:15

标签: scala

Scala中有高阶函数,据我了解,这些函数要么返回函数,要么接受函数。

例如,这是将函数从Int转换为Int的高阶函数:

def highOrderFunc(f: Int => Int) = {
   ???
}

为什么我用List(1,2,3)调用highOrderFunc时会编译?从这个签名我虽然我需要传递一个函数...我在这里很困惑,有人可以解释一下吗?

2 个答案:

答案 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)。在您的情况下,AInt,因此Int => IntPartialFunction[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)