Scala高阶函数

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

在Scala中有高阶函数,据我所知,它们要么返回函数,要么接受函数

例如,这是一个从Int到Int的高阶函数:

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并得到一些结果。