2013-06-20 2 views
4

부분적으로 적용된 함수는 함수이며, 이 필요한 인수의 일부 또는 전부를 전달하지 않고 호출 할 수 있습니다. 위의 예에서 스칼라에서 모든 인수가 빠진 부분 적용 함수

def add(x:Int, y:Int) = x + y 
val paf = add(_ :Int, 3) 
val paf1 = add(_ :Int, _ :Int) 

이 paf1 부분적 모든 인수가 누락 내가 사용하고 호출 할 수와 기능을 적용하는 의미 : paf1(10,20)을하고 원래의 함수 내 질문은 add(10,20)

사용하여 호출 할 수 있습니다 무엇이다 호출 구문이 거의 동일하기 때문에 모든 인수가 누락 된 부분적으로 적용된 함수를 만드는 추가 이점? 메소드를 일등 함수로 변환하는 것입니까?

답변

6

스칼라의 def 키워드는 방법를 정의 및 방법 기능 (스칼라)하지 않은 방법이다. 따라서 귀하의 add은 귀하의 paf1과 같은 방식으로 일등급 기능 실체가 아닙니다. 결과를 산출 할 때 자신의 주장과 의미 론적으로 동일한 경우에도 마찬가지입니다.

스칼라가 자동으로 예를 약간 확장하여 볼 수있는 동등한 기능으로하는 방법을 설정하는 부분 응용 프로그램을 사용합니다 :

def add(x: Int, y: Int) = x + y 
... 
val pa2: (Int, Int) => Int = add 
pa2: (Int, Int) => Int = <function2> 
이이 예에 작은 도움이 보일 수

하지만, 많은에 함수가 필요한 곳에서 (형식 호환 가능) 메소드 이름을 제공 할 수있는 함수가 필요하다는 (더 정확하게는 제약 조건이 다른 곳에서 명시 적으로 명시된) 필요가 있음을 나타내는 비 명시 적 제약이있는 경우가 있습니다.

1

다른 사람들이 여러 가지 유스 케이스를 합성 할 수 있다고 확신하지만 실제로는 함수가 값이라는 사실의 결과 일뿐입니다. 함수를 정상 값으로 전달할 수 없다면 훨씬 더 이상합니다.

스칼라가이 물건을 다루는 일은 약간 어색하다. 부분적인 적용은 보통 currying과 결합됩니다. _을 사용하여 모든 표현식을 기본적으로 확장 할 수 있다는 점을 저는 생각합니다. add(_ : Int, _ : Int)을 쓰는 것으로 스칼라가 효과적으로 커밍 (curling을 둘러싼 스칼라의 통사론)을 쓰고있는 것은 (x : Int) => (y : Int) => add(x, y)입니다. 후자의 정의가 프로그램에서 유용 할 수있는 인스턴스를 생각할 수있을 것이라고 확신합니다.

2

업데이트 : 문제는 내가 왜 η 확장 방법을 원했을까요? 스칼라 성경의 위대한 수사학 전략 중 하나는 많은 페이지를 통해 당신을 모범으로 인도한다는 것입니다. 방금 Charlton Heston과 함께 "The Ten Commandments"를 보았 기 때문에 나는 출애굽기의 은유를 사용합니다. 나는이 대답이 Randall 's보다 더 설명 적이라고 생각하지는 않는다. 당신은 출애굽기의 성경의 책에서 큰 축적가 있음을주의하는 작은 담당자 가진 사람이 필요할 수 있습니다

:

http://www.artima.com/pins1ed/first-steps-in-scala.html#step6

args foreach println.

은 "첫 걸음"간의 이전 단계는

args foreach (arg => println(arg))

, 참으로,하지만 난 아무도 추측하지하고있어 그것을 유형의 추론 신들 종류의 경우 그 방법을 수행합니다.

변경 로그에서 : "부분 적용되지 않은 메소드가 이제 & m의 대신 으로 지정됩니다." 즉, 특정 시점에서 "함수 ptr"이라는 개념은 인수가 제공되지 않은 부분 함수가되었습니다. 그것이 바로 그 것이다. 업데이트 : "은유 적으로."

+1

사람들이 왜 항상 "아래서 투표 할 때 무슨 일인가?"라고 말하는 이유를 알고 있습니다. "유용하지 않다"는 뜻입니다. 이 답변에서 정보를 얻지 못하셨습니까? 나는 확실하게 회상 & m이었던 문법을 모른다. (지금까지는 물론입니다.) –

2

사이에 차이가 있습니다.

예를 들어 List.map의 선언을 보면 정말 기능이 필요합니다. 그러나 Scala 컴파일러는 메서드와 함수를 모두 수용 할만큼 똑똑합니다.

인용 한 기능이 예상되는 무언가로 방법을 강요하기위한

이 트릭 ... here에서, 심지어 컴파일러를 감지하고 그것을 할 수 있도록 간단합니다. 사실이 자동 강제 변환은 자체적으로 Eta 확장이라고 부릅니다.

한편, Java 8; 내가 말할 수있는 한, 그렇게 쉬운 것은 아닙니다.

관련 문제