2012-01-18 5 views
1

"주어진 제어 흐름 그래프에서 라이브 변수 분석을 계산하는 함수 lv: cfg -> (blabel -> ide set)을 작성하십시오."OCaml - 함수로 함수를 출력으로 만드는 방법은 무엇입니까?

cfgblabel을 정의하고 ide set을 문자열 목록으로 사용하면 어떻게 해당 서명으로 함수를 만들 수 있습니까?

+1

그냥 기능 :

let outer_function x = print_endline "outer"; fun y -> print_endline "inner"; x + y 

그래서 코드의 구조는 다음과 같을 것입니까? 왜냐하면 전자는 쉽기 때문입니다.'let f (x : cfg) (y : blabel) : ide set = []' – sepp2k

+0

서명이있는 함수 ... 작성한 함수의 서명이 다릅니다 : cfg -> blabel -> ide set ('(' ')'없이) – genesisxyz

+4

@genesisxyz 정확히 동일한 유형입니다. '->'는 우연히 연관되어 있습니다. OCaml 최상위 레벨은'foo -> (bar -> baz) '타입을 가진 함수를 결코 보여주지 않을 것입니다. 왜냐하면 괄호는 중복되고, 인쇄 타입에서는 최상위 레벨이 여분의 괄호를 남기므로 말입니다. – sepp2k

답변

5

당신은 함수를 정의하기 위해 let 구문 아마 잘 알고 :

let f x = x + 1 in … 

당신은 함수 본문에 포함, 어디에서나이 구문을 사용할 수 있습니다. 이제 내부 함수의 이름을 외부 함수의 반환 값으로 사용하면 외부 함수가 함수를 반환합니다.

let outer_function x = 
    let inner_function y = x + y in 
    inner_function 

let 구문은 fun 또는 function에 대한 사실 문법 설탕입니다. 특히, 한 번만 이름을 사용하기 위해 inner_function을 정의하면 fun 표기법을 사용하고 내부 함수에 이름을 부여하지 않아도됩니다.

let outer_function x = 
    fun y -> x + y 

또한, 당신이 인수하면 그 함수에게 두 개의 인수를 통과 할 때 다음 동작을 고려, 구축 및 내부 기능을 반환하는 것입니다 통과 할 때 모든 외부 함수가있는 경우. 먼저 외부 함수는 첫 번째 (그리고 유일한) 인수를 사용하여 내부 함수를 만듭니다. 그 내부 함수가 두 번째 인수에 적용되어 본문이 실행됩니다. 이것은 두 개의 인수를 취하는 함수가 하나만있는 것과 같습니다. 이 관찰은 currying으로 알려져 있습니다.

let outer_function x y = x + y 

이 함수의 유형은 int -> int -> int입니다. 이것은 int -> (int -> int)과 동일한 유형입니다 (화살표 유형 연산자는 오른쪽 연관입니다).

외부 함수가 내부 함수를 작성하기 전에 일부 기능을 수행 할 때 currying이 적용되지 않습니다. 이 경우 작업은 첫 번째 인수를받은 후에 수행됩니다. 그 서명 또는 서명과 기술 의미와 기능

let lv (c : cfg) : blabel -> ide set = 
    let c' = do_some_precomputation c in 
    fun (bl : blabel) -> (… : ide set) 
+0

완벽한, 감사합니다 :) – genesisxyz

관련 문제