2017-05-06 15 views
1

假設函數foo應該通過將某些工作委託給作爲參數傳遞的某個其他函數來計算輸入值T上的某個返回值R有關Scala函數中參數集順序的規則和慣例

例如,我們可以把它定義爲這樣的:
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的參數集的首選/正確順序是什麼?爲什麼?

回答

3

正確的順序是數據第一,函數第二。

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