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)
。 (注意:f1
和 f2
是 methods 而不是 functions,但您可以使用 η-expansion 轻松将方法转换为函数。)
看起来像这样:
f1(1, 2, f2 _)
//=> 3: Int
但是,请注意结果是3
而不是12
,因为f1
完全忽略了它的第三个参数。它实际上对f2
没有任何作用,它只是返回x + y
并丢弃第三个参数。
如果您想对作为第三个参数传递的函数进行实际操作,则需要调用它。
【讨论】:
以上是关于Scala:在单行中调用具有另一个纯函数作为参数(HOF)的纯函数的主要内容,如果未能解决你的问题,请参考以下文章