为什么List.fill方法有两组参数而不是一组?

时间:2018-08-26 21:02:45

标签: scala

List.fill背后是用两组参数而不是用n和elem参数一起定义的原因是什么

当前定义

def fill[A](n: Int)(elem: ⇒ A): CC[A]

建议的定义

def fill[A](n: Int, elem: ⇒ A): CC[A]

这不是不必要的样板吗?还是设计为将第一部分(List.fill(n))用作咖喱函数构造函数?

1 个答案:

答案 0 :(得分:3)

你可以写

List.fill(10){ val r = math.random; r * r }

但是你不能写

List.fill(10, r = math.random; r * r)

List.fill(10, {r = math.random; r * r})

看起来有些尴尬。

在这种情况下,这几乎是无关紧要的,但是请注意,如何将参数分组到参数列表中的方式会极大地影响类型推断,例如

def map[X, Y](a: F[X])(f: X => Y): F[Y]

在大多数情况下,在没有任何类型注释的情况下都能正常工作,而

def map[X, Y](a: F[X], f: X => Y): F[Y]

使用起来很痛苦。请仔细查看诸如apap2map2 in this piece of code之类的方法。有一个很好的理由说明参数列表是原来的样子,如果对它们的定义不同,您会立即注意到它。