scala - Scala 函数中参数集顺序的规则和实践

标签 scala function methods parameters currying

假设有一个函数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/

相关文章:

c# - 我可以向函数添加属性以防止重新进入吗?

Java - 两个方法具有相同的名称,不同类型的相同参数,但类型按层次结构相关

java - 从 Scala 文件创建 jar 文件

java - Java 中的 OptionT?是否可以?

scala - Scala 在 2.10 中通过模式匹配究竟改进了什么?

html - 单击 HTML 按钮调用 Django

python - 函数内的字典值和列表值

methods - 拥有只有一行的方法有意义吗?

c++ - 使用另一个类成员的类成员函数指针

scala - 如何实现Play Controller的双重异步返回?