我只是不理解如何从以前的功能建立一个功能。如何将Scala函数作为函数传递给另一个函数?
例如,math.min()
函数占用两个数字的最小值。如果我想创建一个功能min3Z(a:int, b:int, c:Int)
怎么办?我将如何建立这个从min
?
我只是不理解如何从以前的功能建立一个功能。如何将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))
如果你想在任意函数传递(例如,使得它使您可以指定最大或最小),你可以指定一个函数作为参数:
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
函数,但这超出了您的问题范围。
如果实施min
的三个值是你的,你可能想通过使用可变参数推广到的参数任意数量的特定情况下(又称可变参数)的功能如下:
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)
请参阅[reduceLeft code]中的示例(https://github.com/scala/scala/blob/v2.11.6/src /library/scala/collection/TraversableOnce.scala#L163) – Odomontois