2017-09-21 4 views
0

스칼라를 배우려고하는데 부분적으로 적용된 함수보다 커링 함수를 사용할 때 혼란 스럽습니다.스칼라 함수를 부분적으로 적용한 함수와 부분적으로 적용되는 함수의 최적 사용 사례

나는 그 개념들이 중복되지 않았 음을 확신하지만, 나는 다른 접근법의 진정한 목적을 볼 수 없다.

이 코드를 실험 하였다

:

List(2, 4, 6, 8) 
List(3, 6) 
: 모두 동일한 결과를 수득

object PartialFunctionTest extends App { 

    def filter(xs: List[Int], p: Int => Boolean): List[Int] = 
    if (xs.isEmpty) xs 
    else if (p(xs.head)) xs.head :: filter(xs.tail, p) 
    else filter(xs.tail, p) 

    def modN(n: Int, x: Int) = ((x % n) == 0) 

    val nums = List(1, 2, 3, 4, 5, 6, 7, 8) 

    println(filter(nums, modN(2,_))) 
    println(filter(nums, modN(3,_))) 
} 

:

object CurryTest extends App { 

    def filter(xs: List[Int], p: Int => Boolean): List[Int] = 
    if (xs.isEmpty) xs 
    else if (p(xs.head)) xs.head :: filter(xs.tail, p) 
    else filter(xs.tail, p) 

    def modN(n: Int)(x: Int) = ((x % n) == 0) 

    val nums = List(1, 2, 3, 4, 5, 6, 7, 8) 

    println(filter(nums, modN(2))) 
    println(filter(nums, modN(3))) 
} 

용액을 부분적으로 적용 용도 기능 :

해결 태닝을 사용

다른 접근 방법이 동일합니까?

누가 내게 계몽 할 수 있습니까? 각각에 가장 적합한 유스 케이스는 무엇입니까?

+2

용어집 : modN (2, _)는 부분 기능이 아닙니다. 비슷한 이름에도 불구하고 똑같은 것은 아니지만 부분적으로 적용된 함수 *입니다. http://sandrasi-sw.blogspot.com/2012/03/understanding-scalas-partially-applied.html –

답변

1

이것은 대부분 문체적인 선택입니다. 귀하의 경우에는 별다른 차이가 없지만 여러 매개 변수 목록을 사용하는 첫 번째 대안이 더 멋지다고 주장합니다.

스타일면에서 카레 함수를 사용하면 카레 함수로 사용할 수 있습니다. 당신을 위해 설계되지 않은 기능을 카레해야 할 때 부분적인 응용 프로그램을 사용하십시오.

그러나 다른 것을 사용해야하는 경우가 있습니다. 예를 들어, 여러 매개 변수 목록은 일반적인 유형이있는 경우, 이러한 유형은 다음

def ex2[A](input: A)(func: A => A): A = func(input) 
ex2(1)(x => "Hello " + x) //compile error, A is Int from first parameter list 

def ex2a[A](input: A, func: A => A): A = func(input) 
ex2a(1, x => "Hello " + x) //compiles and returns "Hello 1", A is Any because all parameters in the same list are used to determine it's type 

하나의 목록에서 흐를 수

def ex1(ints: Int*)(strings: String*) 

몇 가지 경우가 있습니다 당신이 두 목록에 var에 인수를 사용할 수 있습니다 부분 애플리케이션을 사용해야 할 수도 있습니다. 예를 들어 case 클래스 생성자에서 카레를 작성하려고하면 첫 번째 매개 변수 목록 만 사례 클래스 필드의 일부가됩니다.

case class ex3(a: Int, b:Int) 
ex3(1, 2) == ex3(1,3) //false 

val y: Int => ex3 = ex3(1,_) 

y(2) == y(2) //true 
y(2) == y(3) //false 

case class ex3a(a: Int)(b:Int) 

ex3a(1)(2) == ex3a(1)(3) //true 

val x: Int => ex3a = ex3a(1) 

x(1) == x(1) //true 
x(1) == x(2) //true 
+1

currying 및 부분적으로 적용된 함수는 동일하지 않으며 스타일 선택이 아닙니다. 카 리트 함수는 N-arity가 N * 1 - arity 함수를 생성하는 함수입니다. N * 1 - arity 함수는 하나의 인수를 취하여 하나의 추가 함수를 생성하는 함수를 의미합니다. 부분적으로 적용된 함수는 하나의 새로운 함수를 생성하며 n - m은 인수의 수입니다. –

관련 문제