我无法理解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功能"这需要多个参数,但在一个括号中有两个参数n1
和n2
,并且函数作为第二个参数传入。这就像传递给fill
的高阶函数。但这看起来也不正确。
如果有人能用线索指出我正确的方向,我可以更多地了解fill
方法的工作原理,比如方法体。
答案 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*/)
在这种情况下,如果x
或y
为零,那么"长计算"没有执行。