Scala:在单行中调用具有另一个纯函数作为参数(HOF)的纯函数

Posted

技术标签:

【中文标题】Scala:在单行中调用具有另一个纯函数作为参数(HOF)的纯函数【英文标题】:Scala: Call a pure function that has another pure function as parameter (HOF) in a one-liner 【发布时间】:2021-02-17 14:40:28 【问题描述】:

这是我的代码:

  def f1(x: Int, y: Int, f2: Int => Int): Int = 
    x + y
  
  def f2(z: Int): Int = 
    z*z
  

我想单线调用函数,但没有成功。我尝试了以下方法:

f1(1,2, f2(3))

val f2Res = f2(3)
f1(1, 2, f2Res)

我期待以下结果:f1(1, 2, f2(3) = 3 + 9 = 12,但我收到以下错误消息:

type mismatch;
 found   : Int
 required: Int => Int
    f1(1,2, f2(3))

我不明白自己做错了什么,不明白什么。

【问题讨论】:

f2(3) 不是 函数 是一个值,请尝试仅使用 f2,并请查看该语言的任何介绍教程。 感谢您的回答!我浏览了很多资料,您能否指出我应该更多研究的具体主题?是 HOF 还是别的什么? @binaryglot 考虑 Scala 练习 Higher Order Functions。关键是要了解产生值的函数应用程序 f(42) 的概念与作为 本身的函数概念f 之间的区别。 【参考方案1】:

错误信息其实很清楚:f1 的第三个参数应该是一个函数,但你传入的是一个数字f2(3) 不是函数,它是数字 9

您需要传入一个函数,而不是f2(3)。 (注意:f1f2methods 而不是 functions,但您可以使用 η-expansion 轻松将方法转换为函数。)

看起来像这样:

f1(1, 2, f2 _)
//=> 3: Int

但是,请注意结果是3 而不是12,因为f1 完全忽略了它的第三个参数。它实际上对f2 没有任何作用,它只是返回x + y 并丢弃第三个参数。

如果您想对作为第三个参数传递的函数进行实际操作,则需要调用它。

【讨论】:

以上是关于Scala:在单行中调用具有另一个纯函数作为参数(HOF)的纯函数的主要内容,如果未能解决你的问题,请参考以下文章

scala入门

Scala基础篇-函数式编程的重要特性

Python:如何调用具有另一个函数作为参数的函数?

具有未知默认参数的 Scala 函数调用

在scala play 2.4中以函数作为参数调用doAnswer

scala之函数式编程根本概念-纯函数