귀하의 가정은 정확합니다.이 경우 기능은 완전히 동일합니다.
생성 된 IL 코드를 검사하여 (Craig에서 보여준 것처럼) 볼 수 있으며 F # 컴파일러에서 유추 한 유형을 보면이를 볼 수도 있습니다. 두 경우 모두 int -> int -> int
이 표시됩니다. F # 언어는 int
을 반환하고 int -> int
을 반환하는 함수로 간주하지만 효율성을 위해 실제로는 여러 인수가있는 메서드로 컴파일됩니다.
let .. =
다음에 바로 fun
을 쓰면 컴파일러에서이를 표준 기능으로 변환합니다.
let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)
은 이제 두 가지 기능이 매우 다른 두 번째 인쇄는 "안녕하세요"당신은 단지 그것을 줄 때 때문에 :이 기능을 반환하기 전에 몇 가지 계산을 할 경우, 당신은 약간 다른 코드를 작성할 수 있습니다
> let f = f2 1;;
hi // The body is called, prints
val f : (int -> int) // and returns function
> f 2;; // This runs the body of 'fun'
val it : int = 3 // which performs the additiion
당신은 f1
를 사용하여 동일한 코드를 작성할 수 있지만, 첫 번째 명령은 단지 새로운 함수를 작성하고 두 번째 명령이 "안녕하세요"인쇄합니다 : 하나의 인수 (다음 당신이 호출 할 수있는 기능을 반환) 추가를하십시오.
이 경우 f2
에 대해 생성 된 IL 코드는 달라집니다. 이 (FSharpFunc<int, int>
유형) 함수를 반환하는 함수입니다. F #이 표시하는 형식도 달라서 int -> int -> int
대신 int -> (int -> int)
이됩니다. 이 두 가지 유형의 값을 정확히 같은 방식으로 사용할 수 있지만, 단일 인수를 주면 첫 번째 효과가 발생할 수 있음을 알 수 있습니다.
[내 대답은 여기] (http://stackoverflow.com/questions/2175940/int-int-int-what-dis-meis-mean-in-f/2176428#2176428)를 확인하면 차이 –
나는 대답에서 세 번째 케이스를 포함하는 질문을 보완했다. – hyde