2016-08-15 7 views
1

저는 이것에 대해 완전히 분실했습니다. 기능은 오른쪽 맞춤으로 설명되었으므로 let add x y = x + y;;의 기능 유형은 int -> int -> int 또는 int -> (int -> int)입니다.OCaml - (int -> int) 타입의 함수를 제공합니다. int>

(int -> int) -> int 유형의 기능을 정의하는 방법을 모르겠습니다. 첫 번째 인수는 int에 전달되고 int을 반환하는 함수라고 생각했습니다. 나는 시도했다 :

let add = fun x y -> x + y --- int -> int -> int

let add = fun f x = (f x) + 3 --- ('a -> int) -> 'a -> int

+0

'add '의 타입은 정상입니다 :'f'는 추가를 수행 할 수있는'int'를 반환하는 한 무엇이든 취할 수 있습니다. 예를 들어'add int_of_string "2"'이 유효합니다. 컴파일러는 가장 일반적인 유형을 생성하며'x'의 유형을 제한하는 것이 없습니다. 만약 당신이''fx = f (x + 1) + 3'을 더하면 쓸만합니다. – ChriS

답변

2

무엇

let eval (f: int -> int) :int = f 0 

에 대해?

+0

죄송합니다. 아직 함수를 정의하는 방법을 배웠습니다. 콜론 없이는 할 수있는 방법이 있습니까? – stumped

+3

콜론은 무언가의 유형에 주석을 달기위한 것으로 대개 사람의 독자에게 유용합니다. 형식 어노테이션을 생략 할 수 있습니다 :'let eval f = f 0 + 0' –

0
fun x -> (x 1) + 1;; 
- : (int -> int) -> int = <fun> 

또는

let foo f = (f 1) + 1;; 
val foo : (int -> int) -> int = <fun> 

은 매우 Currying의 개념과 연관되어

foo (fun x -> x + 1);; 
- : int = 3 
0

귀하의 질문처럼 작동합니다.

하지만 그 전에는 함수가 될 매개 변수가 필요한 함수를 작성하려면 일반 함수를 선언하고 함수와 같은 매개 변수를 사용할 수 있습니다. 그것을 복잡하게 할 필요가 없습니다. 예 :

let f x = x(10) + 10 

이제는 currying 부분이 있습니다. OCaml에서 매개 변수는 한 번에 하나씩 의미 론적으로 평가되고 인수를 계산 한 후 익명의 함수가 반환됩니다. 함수의 인수 중 일부를 제공하여 효과적으로 새로운 함수 (부분적 응용 프로그램이라고 함)를 생성 할 수 있기 때문에 중요합니다.

아래 예제에서는 증분 함수를 만들기 위해 함수 (연산자 주위의 괄호로 바꾸면 일반 함수로 바뀜)로 +을 사용합니다. 이전 f 기능에 적용하십시오.

let incr = (+) 1 
f incr 

코드는이 link은 OCaml이 적용되는 항목에 대한 자세한 정보가 f incr = incr(10) + 10 = 21

에 평가합니다.

관련 문제