Function 如何将Scala函数作为函数传递给另一个函数?

Function 如何将Scala函数作为函数传递给另一个函数?,function,scala,Function,Scala,我只是不理解如何从以前的函数构建函数 例如,math.min()。如果我想创建一个函数min3Z(a:int,b:int,c:int),该怎么办?我将如何从min构建此功能?您的问题还不清楚。您只是想利用min3Z()中的math.min()?因为在这种情况下,您可以: def min3Z(a: Int, b: Int, c: Int) = math.min(a, math.min(b, c)) 如果要传入任意函数(例如,使其可以指定max或min),可以将函数指定为参数: def min3Z

我只是不理解如何从以前的函数构建函数


例如,
math.min()。如果我想创建一个函数
min3Z(a:int,b:int,c:int)
,该怎么办?我将如何从
min
构建此功能?

您的问题还不清楚。您只是想利用
min3Z()
中的
math.min()
?因为在这种情况下,您可以:

def min3Z(a: Int, b: Int, c: Int) = math.min(a, math.min(b, c))
如果要传入任意函数(例如,使其可以指定max或min),可以将函数指定为参数:

def min3Z(a: Int, b: Int, c: Int, f: (Int, Int) => Int) = f(a, f(b, c))
Scala中的语法
(Int,Int)=>Int
是函数的类型,该函数采用两个
Int
类型的参数,并返回
Int
类型的结果
math.min()
math.max()
都符合此标准


这允许您将min3Z调用为
min3Z(1,2,3,math.min)
min3Z(1,2,3,math.max)
。甚至可以制作一个版本的
min3Z()
,它接受任意数量的
Int
s和任意的
(Int,Int)=>Int
函数,但这超出了您的问题范围。

如果对三个值执行
min
是您的具体情况,您可能希望通过使用变量(也称为varargs)函数将其推广到任意数量的参数,如下所示:

def min(xs: Int*): Int = xs.min
min(1, 2, 3, 4)
min(1.2, 3.4, 5.6, 4.2)
在本例中,变量语法由类型声明--
Int
后的
*
符号表示。这样,以下所有调用都可以工作:

min(1, 2)
min(1, 2, 3, 4, 5, 6, -1)
// and so on...
谈到通用性,您还可以编写一个更通用的
min
,它接受任何数字类型,而不仅仅是
Int
类型:

def min[T : Numeric](xs: T*): T = xs.reduceLeft(implicitly[Numeric[T]].min)
请按如下方式使用它:

def min(xs: Int*): Int = xs.min
min(1, 2, 3, 4)
min(1.2, 3.4, 5.6, 4.2)
请参见中的示例