了解Scala中的Array.fill方法签名

时间:2017-01-21 02:45:33

标签: scala

我无法理解Array.scala中的以下方法签名:

def fill[T: ClassTag](n1: Int, n2: Int)(elem: => T): Array[Array[T]]

我已经从这里读到了多态方法的概念: http://www.scala-lang.org/old/node/121.html

方法fill似乎确实按类型T参数化了值参数。这里的方法签名让我很困惑。它似乎是一个" curried功能"这需要多个参数,但在一个括号中有两个参数n1n2,并且函数作为第二个参数传入。这就像传递给fill的高阶函数。但这看起来也不正确。

如果有人能用线索指出我正确的方向,我可以更多地了解fill方法的工作原理,比如方法体。

1 个答案:

答案 0 :(得分:3)

您在此处引用的方法会创建并填充二维数组。前两个参数Int s决定了数组的尺寸(X和Y轴)。

第3个参数位于单独的参数组中。那是咖喱的部分。如果它已经写成fill(n1, n2, elem)那么它就不是一个curry方法。或者所有参数都可以进行调整:fill(n1)(n2)(elem)。在Haskell中,所有参数都是curry。

elem: => T符号表示这是"名称"参数。它看起来类似于函数定义,但情况并非如此。它只是表示在调用时不评估接收的参数elem。它在被引用时被评估,这可能永远不会被引用。例如:

Array.fill(x,y)(/*some-long-calculation*/)

在这种情况下,如果xy为零,那么"长计算"没有执行。