2011-02-17 4 views
2
감안할 때

고차 기능 단위 incr ~ call, 람다를 사용하지 않고 : (fun() -> incr 1)?다른 기능을 얻을 수있는 기능을 무두질 다음은 등> '는

분명히 함수가 "완전히 적용되었습니다"이므로 (incr 1)을 전달하면 작동하지 않습니다.

편집

는 명확히하기 위해 : 나는 궁금하네요은 함수가되도록, 기능을 카레 할 수있는 방법이 있는지 : unit -> 'a.

+0

람다가 있습니다 : 그것은 여전히 ​​명시적인 람다보다 더 나은,하지만입니다

확실하지 경우 구문 단축키. 네가 여기서 뭘하고 있는지 확신 할 수 없어. Btw, 귀하의 모범이 지나치게 단순화되었거나'재미() -> 2'입니까? –

+0

질문에 희망적으로 설명을 추가했습니다. 질문은 currying의 특별한 경우에 관한 것입니다. – Daniel

+0

Btw, [부분 기능 응용 프로그램과 대조적 인 대조] (http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). 당신이하고있는 일은 정확히 아니지만, 카레보다 부분적으로 적용되는 것과 같습니다. –

답변

2

당신은 자신과 같은 바로 가기 정의 할 수 있습니다 :

let ap f x = fun() -> f x 

call (ap incr 1) 

당신이 변환하고자하는 함수는 순수 기능으로 발생하는 경우, 대신 상수 함수를 정의 할 수 있습니다

let ct x _ = x (* const is reserved for future use :(*) 

call (ct (incr 1)) 
+0

이것은 좋은 것입니다. 질문을 좀 더 길게 남겨 둘 수 있습니다. 내가 모르는 F # 문법이 있다면 궁금하다. – Daniel

1

그것은 외모를 더 엄격한 F #에 게으름을 추가하려는 시도와 비슷합니다. 그리고 사실에는 F에 #을위한 시설이 내장되어 있습니다 : http://msdn.microsoft.com/en-us/library/dd233247.aspx - lazy 키워드 플러스 어색한 Force :

let incr i = 
    printf "incr is called with %i\n" i 
    i+1 

let call (f : unit -> 'a) = 
    printf "call is called\n" 
    f() 

let r = call <| (lazy incr 5).Force 

printf "%A\n" r 
관련 문제