【问题标题】:Scala high order functions confusionScala高阶函数混淆
【发布时间】:2018-07-02 23:57:30
【问题描述】:

在 Scala 中有高阶函数,据我了解,它们要么是返回函数的函数,要么是接受函数的函数。

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

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    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

    【讨论】:

    • 那时必须小心那个。大概这是对Seq 的有意识的设计决定,而不是集合层次结构的不受欢迎的人工制品?
    • 根据this answer,当我们通过索引获取元素(如someList(1)someSeq(1))时,可能是为了方便使用apply 方法
    • 这是一个有用的功能。列表只是从索引到值的映射。它的 apply 方法接受索引,并返回一个值。从语法上讲,doThing(1) 可能是一个列表索引或一个函数调用,实际上不应该有任何关心的理由。在任何一种情况下,我们都会传入一个 int 并得到一些东西。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2012-03-05
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      相关资源
      最近更新 更多