Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala函数中参数集顺序的规则和实践_Scala_Function_Methods_Parameters_Currying - Fatal编程技术网

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

Scala函数中参数集顺序的规则和实践,scala,function,methods,parameters,currying,Scala,Function,Methods,Parameters,Currying,假设有一个函数foo,它应该通过将一些工作委托给作为参数传递的其他函数,来计算输入值T上的一些返回值R 例如,可以这样定义: def foo(数据:List[T],委托:T=>R):List[R] 但是,如果我想对数据或委托重用我的函数,我不能,因此我可以将它们拆分为单独的参数集,如下所示: def foo(数据:List[T])(委托:T=>R):List[R] 但是,现在出现了一个问题。这是一个“好”订单,还是应该是 def foo(代表:T=>R)(数据:List[T]):List[R]

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

例如,可以这样定义:
def foo(数据:List[T],委托:T=>R):List[R]

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

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


我想我的问题的一般形式如下:假设我们需要定义一个函数
f
,它对数据
x1,x2,…,xN
,使用对数据进行操作的委托函数
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