假设有一个函数foo
应该计算一些返回值 R
输入值 T
通过将一些工作委托(delegate)给作为参数传递的其他函数。
例如,可以这样定义它:
def foo(data: List[T], delegate: T => R): List[R]
但是,如果我想将函数与数据或委托(delegate)一起重用,则不能,因此我可以将它们拆分为单独的参数集,如下所示:
def foo(data: List[T])(delegate: T => R): List[R]
但是,现在出现了一个问题。这是一个“好的”订单吗?或者应该是
def foo(delegate: T => R)(data: List[T]): List[R]
我想我的问题的一般形式如下:鉴于我们需要定义一个函数 f
,对数据进行操作 x1, x2, ..., xN
,使用委托(delegate)函数g1, g2, ..., gM
对数据和函数进行操作 h1, h2, ..., hK
不对数据进行操作,函数 f
的参数集的首选/正确顺序是什么为什么?
最佳答案
正确的顺序是数据第一,功能第二。
第一个原因是,如果 T
是函数的类型参数,这样您将获得更好的类型推断:
scala> def foo[T](l: List[T])(f: T => T): Unit = ()
foo: [T](l: List[T])(f: T => T)Unit
scala> foo(List(1))(x => x + 1)
scala> def foo2[T](f: T => T)(l: List[T]): Unit = ()
foo2: [T](f: T => T)(l: List[T])Unit
scala> foo2(x => x + 1)(List(1))
<console>:13: error: missing parameter type
foo2(x => x + 1)(List(1))
第二个原因是匿名函数看起来更好。比较
foo2[Int] { x =>
x + 1
} (List(1)) // Meh
与
foo[Int](List(1)) { x =>
x + 1
} // Wow
关于scala - Scala 函数中参数集顺序的规则和实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43823532/