2015-04-20 73 views
2

我只是不理解如何从以前的功能建立一个功能。如何将Scala函数作为函数传递给另一个函数?

例如,math.min()函数占用两个数字的最小值。如果我想创建一个功能min3Z(a:int, b:int, c:Int)怎么办?我将如何建立这个从min

+0

请参阅[reduceLeft code]中的示例(https://github.com/scala/scala/blob/v2.11.6/src /library/scala/collection/TraversableOnce.scala#L163) – Odomontois

回答

7

你的问题不清楚。你只是试图在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函数,但这超出了您的问题范围。

0

如果实施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) 
相关问题