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

时间:2015-04-20 00:51:31

标签: function scala

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

例如,math.min()函数至少需要两个数字。如果我想创建一个函数min3Z(a:int, b:int, c:Int)怎么办?我如何从min构建此内容?

2 个答案:

答案 0 :(得分:7)

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

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(Int, Int) => Int函数具有任意数量,但这超出了您的范围问题

答案 1 :(得分:0)

如果针对三个值实现min是您的特定情况,您可能希望通过使用variadic(aka varargs)函数推广到任意数量的参数,如下所示:

def min(xs: Int*): Int = xs.min

在这种情况下,可变参数语法在类型声明之后用*符号表示 - 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)

使用如下:

min(1, 2, 3, 4)
min(1.2, 3.4, 5.6, 4.2)