2017-05-06 11 views
1

fooは、入力値Tにいくつかの戻り値Rを計算する関数があり、その一部をパラメータとして渡される他の関数に委譲すると仮定します。
def foo(data: List[T], delegate: T => R): List[R]Scala関数のパラメータセットの規則の規則と習慣

をしかし、私はデータを持つ、またはデリゲートと私の機能のいずれかを再利用したい場合は、私はできませんので、私は別のパラメータセットにそれらを分割できます。たとえば、1はそのように定義することができ

次のようになります。
def foo(data: List[T])(delegate: T => R): List[R]

しかし、今質問があります。 、「良い」ためということがあるか、それは私が私の質問の一般的な形式は、以下のことになると思います
def foo(delegate: T => R)(data: List[T]): List[R]

次のようになります。私たちは、デリゲート関数を使用して、データx1, x2, ..., xNで動作する機能fを定義する必要が考えますデータを操作するg1, g2, ..., gM、データを操作しない関数h1, h2, ..., hK、機能fのパラメータセットの優先/正しい順序は何ですか?その理由は何ですか?

答えて

3

正しい順番はデータであり、2番目の機能です。

第一の理由は、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)) 

第二の理由は、それは無名関数とのよりよいに見えるということです。

foo[Int](List(1)) { x => 
    x + 1 
} // Wow 

foo2[Int] { x => 
    x + 1 
} (List(1)) // Meh 

比較