是否可以定義使用的變體(或別的東西),這將包含整數和功能的同時一個列表?我特別感興趣的是在列表中混合函數和其他類型。變量和列表OCaml中
類似地,是否可以創建一個可以返回數字或函數的函數? 請儘可能給出兩種情況的代碼示例。
是否可以定義使用的變體(或別的東西),這將包含整數和功能的同時一個列表?我特別感興趣的是在列表中混合函數和其他類型。變量和列表OCaml中
類似地,是否可以創建一個可以返回數字或函數的函數? 請儘可能給出兩種情況的代碼示例。
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]
當然,兩者在OCaml中是可能的。
如果你想有可能使一個表達式,以評估兩個(或更多不同類型)的值,那麼就意味着,要創建一個新的類型,其中將包括所有這些類型。回想一下,一個類型可以與一個集合進行比較。所以,如果你要定義一個新的類型t
,可以包含t1
類型和t2
的值,那麼你需要有一個工會。由於t1
和t2
類型具有不同的屬性,因此我們希望能夠稍後區分它們是很自然的,因此我們希望使聯盟能夠進行區分。碰巧的是,這OCaml有一個內置的可識別聯合支持 - 變種,例如,
type t = T1 of t1 | T2 of t2
這種類型的定義創建一個新的類型,即類型t1
和t2
可識別聯合。該定義自然產生投影和注入功能。要將類型t1
的值x
注入類型t
,請使用T1 x
(對應t2
類型的值x
,使用T2 x
)。使用模式匹配來投影來自t
類型的值y
要麼t1
或t2
,例如match y with T1 -> ... | T2 -> ...
。
是怎麼回事,肯定會令你的答案更有幫助的一點解釋。 –