2014-07-07 3 views
0

두 종류 : int -> int -> intint -> (int -> int)이 같은가요?`int -> (int -> int)`를 얻는 방법?

let f x = fun y -> x + y + 1으로 작성하면 utop은 int -> int -> int을 반환합니다. 하지만 int를 매개 변수로 사용하고 int를 받아 int를 반환하는 함수가 필요합니다. 즉, int -> (int -> int)

이렇게 할 수있는 방법이 있습니까?

(’a * ’b -> ’c) -> (’a -> ’b -> ’c)의 경우에도 let f g = fun a b -> g (a,b)을 작성했지만 (’a * ’b -> ’c) -> ’a -> ’b -> ’c을 반환하면 괄호가 제거됩니다. 하지만 왜?

결과로 새로운 함수가 반환되면 어쨌든 카레됩니까?

+1

'->'는 오른쪽 연관입니다 – blgt

답변

2

일반적으로 람다 계산에서 모든 함수는 1 개의 인수를가집니다. 튜플이 아닌 두 개의 인수를 취하는 함수는 1 개의 인수를 취하여 다른 함수를 반환하는 함수입니다. 이 관점에서 문제를 살펴 본다면 ->이 우연히 연관되어 있음을 이해할 수 있습니다.

+0

그래서'int -> (int -> int)'형식을 출력 할 방법이 없습니까? –

+2

형식 식 프린터가 중복 된 괄호를 출력하지 않도록 작성되었습니다. 'let f : int -> (int -> int) = (+) ;;'시도하자. – camlspotter

0

그래, 그들은 동일합니다.

당신은 전체 아이디어는 curryfied 기본적으로되는 기능입니다

let f x y = x + y + 1;; 
val f : int -> int -> int = <fun> 
# let g = f 1;; 
val g : int -> int = <fun> 
# let _ = List.map g [1;2;3];; (* would do the same with (f 1) instead of g *) 
- : int list = [3; 4; 5] 

입력, 그것을 밖으로 시도 할 수 있습니다. a -> (b -> c)a -> b -> c이 동일하므로 가능한 가장 가벼운 유형으로 표시됩니다.

2

예, 동일합니다. 화살표는 오른쪽 연관 잉소 생성자이므로 괄호는 오른쪽에서 중복됩니다.

let f x y z = e 

다른

let f = fun x -> fun y -> fun z -> e 

모두가 양식을 다음에 대해 단순히 문법 설탕 것을 깨닫게 아마도 도움이된다.

관련 문제