首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala高阶函数混淆

Scala高阶函数混淆
EN

Stack Overflow用户
提问于 2018-07-02 23:25:15
回答 2查看 86关注 0票数 4

在Scala中有一些高阶函数,据我所知,这些函数要么是返回函数,要么是接受函数。

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

代码语言:javascript
复制
def highOrderFunc(f: Int => Int) = {
   ???
}

为什么当我用List(1,2,3)调用highOrderFunc时它会编译?从这个签名我想我需要传递一个混淆在这里的function...im,有人能解释一下吗?

EN

回答 2

Stack Overflow用户

发布于 2018-07-02 23:41:28

List[A]扩展了Seq[A],后者也扩展了PartialFunction[Int, A]

代码语言:javascript
复制
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进行传递

票数 3
EN

Stack Overflow用户

发布于 2018-07-02 23:42:02

这是因为List(1, 2, 3)扩展了Int => Int。在类层次结构的上一层,List扩展了Function1 ( =>语法背后的实际特性,也就是语法)。试试看,它将是一个从索引到元素的分部函数。

代码语言:javascript
复制
@ 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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51139385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档