2012-01-18 27 views
1

「編寫函數lv: cfg -> (blabel -> ide set),它計算給定控制流圖上的實時變量分析。」OCaml - 如何創建一個函數作爲輸出?

已將cfgblabel定義爲ide set作爲字符串列表,如何創建一個具有該簽名的函數?

+1

只是一個與簽名或與簽名和描述語義的功能函數?因爲前者很容易:'let f(x:cfg)(y:blabel):ide set = []' – sepp2k 2012-01-18 16:02:35

+0

具有該簽名的函數...您寫入的函數具有不同的簽名:cfg - > blabel - > IDE設置(沒有'('')') – genesisxyz 2012-01-18 16:10:15

+4

@genesisxyz這是完全相同的類型。 ' - >'是正確關聯的。 OCaml頂層將永遠不會顯示具有'foo - >(bar - > baz)'類型的函數,因爲其中的括號是多餘的,頂層在打印類型時會留下冗餘括號。 – sepp2k 2012-01-18 16:14:34

回答

5

你想必熟悉let語法來定義一個函數:

let f x = x + 1 in … 

您可以在任何地方使用這個語法,包括在一個函數體。現在,如果您碰巧使用內部函數的名稱作爲外部函數的返回值,則外部函數將返回一個函數。

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

let語法是用於funfunction事實語法糖。特別是,如果您定義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 outer_function x = 
    print_endline "outer"; 
    fun y -> print_endline "inner"; x + y 

所以你的代碼的結構很可能是這樣的:

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

完美,謝謝:) – genesisxyz 2012-01-20 17:20:00

相關問題