2012-10-16 2 views
3

누군가 나를 currying의 개념을 설명해 주시겠습니까? 기능적 언어 소개를위한 '현대 프로그래밍 언어'클래스에서 ML을 배우기 때문에 주로 배우고 있습니다. 이 예제 사용할 수 있습니다 특히ML 기능 currying

:

-fun g a = fn b => a+b; 
     val g = fn: int -> int -> int 
    -g 2 3; 
     val it = 5 : int 

을 나는 이러한 매개 변수가 전달되는 방법이나 심지어 처음에 그것에 대해 생각하는 방법에 대해 혼란 스러워요.

도움 주셔서 감사합니다.

답변

4

이 경우, currying을 명시 적으로 만들면 더 쉽게 이해할 수 있습니다.

함수 정의를 읽으면 (구절로) 다음과 같이 말합니다. "g 함수를 만듭니다. a이 주어지면 fn b => a+b을 반환합니다."

즉, g 2을 호출하면 fn b => 2+b 함수가 반환됩니다. 따라서 g 2 3으로 전화하면 실제로는 (g 2) 3이라고 부릅니다. 먼저 위에서 언급 한 함수를 얻은 다음이 함수를 3 값에 사용하면 5이됩니다.

커링은 단순히 입력을 가져 와서 새로운 기능을 생성하는 여러 "단계"에서 기능을 만드는 개념입니다. SML은 다음에 해당 g을,이에 대한 문법 설탕 있습니다

fun g a b = a + b; 
+0

완전 철자 아웃 버전은 다음과 같을 것이다 :'발 g = FN A => B => A + b' FN. 함수가 값이고,'fun' 키워드에 특별한 마법이 없다는 것을 보여주기 때문에 유용하다고 생각합니다. – waldrumpus

+0

@waldrumpus : 사실,'fun'는'val'이 아니라'val rec'를위한 통 신당입니다. 그러나이 경우 중요하지 않습니다. :) –

+0

'환경'(나는 SML/NJ를 사용하고 있습니다)이 fn b => a + b에 어떤 것이 있는지를 어떻게 알 수 있습니까? 그 시점에서 언 바운드 변수가 아닙니다. 어쩌면 혼란은 내가 읽는 방식 일 것이다. 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 읽어야합니까? – Nick