2012-09-28 2 views
3

내가 스칼라 단지 새로운 오전과 스칼라 같은 "카레 기능"을 제공하는 이유는 나에게 약간의 혼란 보인다스칼라에서 카레 함수의 근본적인 이유는 무엇입니까?

스칼라는 이미 예를 들어 정상적인 기능에 '일부 응용 프로그램'을 제공하기 때문에
//curried function 
def add(lhs: Int)(rhs: Int) = lhs + rhs 
//so we can do partially binding like 
val add1 = add(1)_ 

그것의 혼란,

내 질문은 : 부분적인 응용 외에 스칼라의 일반적인 기능보다는 카레 함수를 사용하는 다른 점이 있습니까?

EDT1 : 답장을 보내 주셔서 감사합니다. 나는 아래의 모든 대답에서 새로운 것을 배웠다고 생각한다.

+1

이 질문에 모든 응답을 실제로 _multiple 매개 변수 lists_보다는 _function의 currying_의 개념에 대한 스칼라의 지원을 언급하는이에 대한 예는 스칼라에 프로그래밍, 섹션 9.4에서입니다. @TomaszNurkiewicz는 지적했듯이, 함수가 단일 매개 변수 목록을 가지고 있는지 또는 다중 매개 변수 목록을 가지고 있는지에 관계없이 일부 매개 변수 만 사용하면 실제로 _ 부분 적용 함수 _가됩니다. 실제로 나는 그 차이가 사소하다는 것을 짐작하지만, 나는 여전히 용어를 똑바로 유지하는 것이 좋다라고 생각한다. – DaoWen

답변

8

이론적 인 동기를 제쳐두고 (위키 백과의 Contrast with partial function application 참조 : currying 참조) 실제적인 의미가 있습니다. 마지막 인수가 코드 블록 일 때 구문은 훨씬 간단하고 읽기 쉽습니다.

다음 방법 비교 : (아무런으로) 무두질 뒤에

test("abc", { 
    //some code 
}) 

test2("abc") { 
    //some code 
} 
+0

누군가 여기서 _ 부분적 기능 _ 응용 _을 지적 해 주어서 기쁩니다. 스칼라의 _multiple 매개 변수 lists_와 _curried 함수의 개념을 결합하면 버그가 나옵니다! – DaoWen

5
  • 좋네요 구문은 다음 올바른 매개 변수 목록 왼쪽에서 대신 추가 (1, _)
  • 타입 추론 (1)를 추가합니다. 예를 들어 콜렉션의 폴드 메소드에서 사용됩니다.
  • 암시 적 매개 변수 목록에도 필요합니다.

물론 마지막 두 가지가 다르게 구현 될 수 있다고 주장 할 수 있습니다.

2

내가 이론에 익숙하지 않은,하지만 나는 알고있다 : 두 번째 메소드 호출이 훨씬 낫 네요

def test1(name: String, callback: => Unit) {} 
def test2(name: String)(callback: => Unit) {} 

을 비교 currying이 더 잘 작동하는 최소한 하나의 구체적인 상황에 대해 설명합니다. 대괄호 대신 중괄호 쌍을 사용하여 함수를 호출하는 것은 단일 매개 변수 함수에서만 가능합니다. 따라서 각각 하나의 매개 변수를 갖는 두 개의 매개 변수 목록을 갖는 카레 함수에 대해 수행 할 수 있지만 한 매개 변수에 부분적으로 적용된 정상 함수에는 사용할 수 없습니다.

이것은 함수의 일부 매개 변수가 익명 함수 자체 인 제어 구조 나 DSL을 구현할 때 특히 유용합니다.

val file = new File("date.txt") 

withPrintWriter(file) { 
    writer => writer.println(new java.util.Date) 
} 
관련 문제