2017-10-13 1 views
0

OCaml에서 학교 과제를하고 있는데 표현의 의미에 관한 질문이있었습니다.(int -> int) -> (int -> int)는 무엇을 의미합니까?

내가, 예를 들어, 쓴 경우 함수를 정의 할 때 :

let iter : int * (int -> int) -> (int -> int) 
= fun (n,f) -> 

(int -> int)은 무엇을 의미합니까? 함수 자체가 인수로 쌍을 받겠다는 것을 이해하지만 괄호가 무엇을 의미하는지 완전히 이해하지 못합니다 ...

+0

에서 적용 '(INT -> INT)는''int'에 int''에서 함수의 유형이다. – gallais

+1

@gallais는별로 도움이되지 못했습니다. – PieOhPah

+0

당신이 무엇을 요구하고 있는지 명확하지 않습니다 ... – gallais

답변

4

괄호는 (int -> int) 유형의 함수 사이에서 모호하지 않습니다. 즉 매개 변수를 취합니다. int을 입력하고 int을 반환하고 해당 함수의 매개 변수로 취한 두 개의 일반 문자 int을 반환합니다. 첫 번째 괄호 쌍이 없으면 iter에는 (int, int) 튜플이 필요하며 다른 매개 변수가없는 경우 반환 유형으로 int -> int -> int이 필요합니다.

두 번째 괄호 쌍은 꼭 필요한 것은 아니지만 반환 할 함수를 기대하는 좋은 지표가 될 수 있습니다. 한 쌍의 괄호가 없으면 함수는 (int, int -> int)의 튜플과 또 다른 int을 기대하는 것으로 읽을 수 있습니다. 예를 들어 int을 반환합니다.

당신의 iter과 동일한 서명을 가진 함수의 예는 수 :

let random_func: int * (int -> int) -> (int -> int) = 
    fun (n, f) -> f 
1

찾기 TL; 이하 DR.

ML- 언어가 뿌리깊은 람다 미적분학 (저와 함께)에 핵심 아이디어는 응용 프로그램 또는 기능 매핑을 추상화하는 것에 관한 것입니다. 단 하나의 인수.

λx[x + 1] 

위의 λx 대한 값 대기 애플리케이션으로 기능 x + 1 추상화 판독 변화로부터 가드 및 적용 (값을 가진 함수의 x 교체 및 계산). int -> int 유형, 또는 입력 및 출력 유형 intint 타입을 갖는다

fun x -> x + 1 

:

OCaml의 위는 동등하다. 이제 람다는 한 번에 하나의 인수 만 처리합니다. 이 함수는 x*x -2*x + c (다항식 함수 x2 − 2·x + c)과 같은 여러 인수가있는 함수에서 어떻게 작동합니까? 그것은 이전과 마찬가지로 한 번에 하나씩 논쟁을 평가합니다.

따라서 이전 응용 프로그램의 출력은 다음 응용 프로그램의 입력이됩니다.OCaml의 등가 될

fun c x -> (x * x) - (2 * x) + c 

함수 int -> int -> int 또는 (int -> int) -> int (입력 체인 -> 출력) 타입을 갖는다는 인수 x = 3 부분적 함수를 적용 할 경우, 감소 된 기능과 같이 얻을 :

fun c 3 -> (3 * 3) - (2 * 3) + c 
fun c -> 9 - 6 + c 
fun c -> 3 + c 

결과 함수의 유형은 int -> int입니다. 이것은 currying의 기초입니다. 처음에는 혼란스러워 보일 수도 있지만 명령형 언어로는 매우 유용하고 과소 평가되었습니다. 예를 들어, 당신이 이런 식으로 뭔가를 할 수 :

let waiting_for_c_and_x = fun c x -> 2*x + c 
let waiting_for_c = waiting_for_c_and_x 10 in 
    let result = waiting_for_c 2 (* result = 22 *) 

TL; DR을

그러나, 그룹에 입력이 체인을 괄호를 사용하여/출력이 까다로운하지만 OCaml이 필요하기 때문에 실제로 컴파일러는 할 수 없습니다 ~에서 추측 int * int -> int는 입력으로서 int * int 쌍을 허용하는 응용 프로그램을 의미하고 int 한 쌍의 기록 수를 인수로 입력 int -> int하는 기능 (받아들이 (우리 (int * int) -> int 같이 괄호로 수) 출력 또는 하나로서 int을 돌아 오면 int * (int -> int)으로).

Stanford Encyclopedia of Philosophy (very good read)

+0

이 특별한 경우에 괄호가없는 것으로 설명하면 설명이 잘 될 수 있습니다.이 함수는 정수에 쌍을 기대하고'int -> 유형의 함수를 반환합니다. 왜냐하면'*'는'->'에 더 높은 우선 순위를 가지고 있기 때문입니다. – Lhooq

관련 문제