我在看這段代碼(前兩行是背景關系的偽代碼)
typ = Void | Bool | Int
type bind = typ * string
let check_binds (kind : string) (binds : bind list) =
List.iter (function
(Void, b) -> raise (Failure ("illegal void " ^ kind ^ " " ^ b))
| _ -> ()) binds;
所以我認為正在發生的是有一個名為的串列binds,并且由于iter,在“ List.iter”之后的括號內定義的函式被應用于binds.
但是我對功能本身感到困惑。這是我嘗試單獨寫出函式的嘗試
function
(Void, b) -> raise (Failure ("illegal void " ^ kind ^ " " ^ b)
| _ -> ()
什么_ -> ()意思?
uj5u.com熱心網友回復:
這是一個使用模式匹配和 2 個子句的匿名函式定義:
- 第一個涵蓋案例
(Void, b) - 第二個涵蓋“其他一切”:
_在模式匹配中是一個匹配任何東西的包羅萬象的分支。
當后一個分支在您的代碼段中匹配時,該函式將回傳()——這是 type 唯一可能的值unit。
所以這個 lambda 函式是一種驗證器,如果你有一個錯誤型別的值(由任何引數化的 Void)并且在其他情況下什么都不做(回傳一個單位),它就會引發錯誤。老實說,這看起來像是一個試圖減輕次優型別設計的黑客 - 我很確定我們可以做得更好并制作不可表示的(Void, b)狀態(但這與所要求的內容正交)......
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/398018.html
下一篇:很可能我在某處錯誤地分配了記憶體
