Scalaで関数を部分的に適用しました-
def sum(a:Int,b:Int,c:Int) = a+b+c
val partial1 = sum(1,_:Int,8)
部分的に適用された機能を使用することの利点は何であるか疑問に思いました。それとも単に構文上の追加ですか?
Scalaで関数を部分的に適用しました-
def sum(a:Int,b:Int,c:Int) = a+b+c
val partial1 = sum(1,_:Int,8)
部分的に適用された機能を使用することの利点は何であるか疑問に思いました。それとも単に構文上の追加ですか?
一般的な部分適用関数について、書籍「Programming in Scala, 2nd edition」には次のように記載されています。
アンダースコアを使用してパラメーター リスト全体を表すこの種の式について考える別の方法は、def を関数値に変換する方法です。
たとえば、 などのローカル関数があるsum(a: Int, b: Int, c: Int): Int
場合、apply メソッドが同じパラメーター リストと結果の型を持つ関数値でそれを「ラップ」できます。
scala> def sum(a: Int, b: Int, c: Int) = a + b + c
sum: (a: Int,b: Int,c: Int)Int
scala> val a = sum _
a: (Int, Int, Int) => Int = <function3>
(ここでa(1, 2, 3)
は、次の短縮形を示します。
scala> a.apply(1, 2, 3)
res12: Int = 6
)
メソッドまたはネストされた関数を変数に代入したり、引数として別の関数に渡したりすることはできませんが、メソッドまたはネストされた関数を名前の後にアンダースコアを付けて関数値でラップすると、これらのことが可能になります。
利点は、sum(1,_,8)
よりも入力と読み取りが少ないことですx => sum(1,x,8)
。
それだけです。
sum(1,_,8) は x => sum(1,x,8) よりも入力と読み取りが少ない
ただし、どちらも合法ではありません。パラメータ タイプを指定する必要があります。