「編寫函數lv: cfg -> (blabel -> ide set)
,它計算給定控制流圖上的實時變量分析。」OCaml - 如何創建一個函數作爲輸出?
已將cfg
和blabel
定義爲ide set
作爲字符串列表,如何創建一個具有該簽名的函數?
「編寫函數lv: cfg -> (blabel -> ide set)
,它計算給定控制流圖上的實時變量分析。」OCaml - 如何創建一個函數作爲輸出?
已將cfg
和blabel
定義爲ide set
作爲字符串列表,如何創建一個具有該簽名的函數?
你想必熟悉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 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)
完美,謝謝:) – genesisxyz 2012-01-20 17:20:00
只是一個與簽名或與簽名和描述語義的功能函數?因爲前者很容易:'let f(x:cfg)(y:blabel):ide set = []' – sepp2k 2012-01-18 16:02:35
具有該簽名的函數...您寫入的函數具有不同的簽名:cfg - > blabel - > IDE設置(沒有'('')') – genesisxyz 2012-01-18 16:10:15
@genesisxyz這是完全相同的類型。 ' - >'是正確關聯的。 OCaml頂層將永遠不會顯示具有'foo - >(bar - > baz)'類型的函數,因爲其中的括號是多餘的,頂層在打印類型時會留下冗餘括號。 – sepp2k 2012-01-18 16:14:34