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)
)用作咖喱函数构造函数?
答案 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]
使用起来很痛苦。请仔细查看诸如ap
,ap2
或map2
in this piece of code之类的方法。有一个很好的理由说明参数列表是原来的样子,如果对它们的定义不同,您会立即注意到它。