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

时间:2017-05-06 17:41:39

标签: scala function methods parameters currying

假设有一个函数foo应该通过将一些工作委托给作为参数传递的其他函数来计算输入值R的一些返回值T

例如,可以将其定义为:
def foo(data: List[T], delegate: T => R): List[R]

但是,如果我想重用我的函数与数据,或者使用委托,我不能,所以我可以将它们拆分成单独的参数集,如下所示:
def foo(data: List[T])(delegate: T => R): List[R]

但是,现在出现了一个问题。这是一个“好”的订单,还是应该是 def foo(delegate: T => R)(data: List[T]): List[R]

我想我的问题的一般形式如下:鉴于我们需要定义一个函数f,它使用代理函数x1, x2, ..., xN对数据g1, g2, ..., gM进行操作不对数据进行操作的数据和函数h1, h2, ..., hK,函数f的参数集的首选/正确顺序是什么?为什么?

1 个答案:

答案 0 :(得分:4)

正确的顺序是数据优先,功能第二。

第一个原因是,如果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