2016-10-23 56 views
0

是否可以定義使用的變體(或別的東西),這將包含整數和功能的同時一個列表?我特別感興趣的是在列表中混合函數和其他類型。變量和列表OCaml中

類似地,是否可以創建一個可以返回數字或函數的函數? 請儘可能給出兩種情況的代碼示例。

回答

1
type my_elt = 
    | Null 
    | Int of int 
    | Fun1 of (int-> unit) 
    | Fun2 of (int-> int) 

let eval a =function 
    | Fun1 f -> f a;Null 
    | Fun2 f -> Int (f a) 
    | _  -> Null 

let leval a l = List.map (fun elt -> eval a elt) l 
;; 

測試:

let l=[Int 2;Fun1 (Printf.printf "%d");Fun2 ((+)2) ] 
# leval 2 l;; 
2- : my_elt list = [Null; Null; Int 4] 
+0

是怎麼回事,肯定會令你的答案更有幫助的一點解釋。 –

0

當然,兩者在OCaml中是可能的。

如果你想有可能使一個表達式,以評估兩個(或更多不同類型)的值,那麼就意味着,要創建一個新的類型,其中將包括所有這些類型。回想一下,一個類型可以與一個集合進行比較。所以,如果你要定義一個新的類型t,可以包含t1類型和t2的值,那麼你需要有一個工會。由於t1t2類型具有不同的屬性,因此我們希望能夠稍後區分它們是很自然的,因此我們希望使聯盟能夠進行區分。碰巧的是,這OCaml有一個內置的可識別聯合支持 - 變種,例如,

type t = T1 of t1 | T2 of t2 

這種類型的定義創建一個新的類型,即類型t1t2可識別聯合。該定義自然產生投影和注入功能。要將類型t1的值x注入類型t,請使用T1 x(對應t2類型的值x,使用T2 x)。使用模式匹配來投影來自t類型的值y要麼t1t2,例如match y with T1 -> ... | T2 -> ...