OCaml 函数中的 _ -> () 是什么意思?
What does `_ -> ()` mean in OCaml function?
我正在查看这段代码(前两行是上下文的伪代码)
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)
| _ -> ()
_ -> ()
是什么意思?
这是一个使用带有 2 个子句的模式匹配的匿名函数定义:
- 第一个涵盖案例
(Void, b)
- 第二个涵盖“其他所有内容”:
_
在模式匹配中是匹配任何内容的包罗万象的分支。
当后一个分支在您的代码段中匹配时,该函数将只是 return ()
- 这是 unit
.
类型的唯一可能值
所以这个 lambda 函数是一种验证器,如果你有一个错误类型的值(由任何参数化的 Void)并且在其他情况下什么都不做(returns 一个单元),它会引发错误。老实说,这看起来像是一个试图减轻次优类型设计的黑客攻击——我很确定我们可以做得更好,使 (Void, b)
无法表示的状态(但这与所要求的正交)...
我正在查看这段代码(前两行是上下文的伪代码)
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)
| _ -> ()
_ -> ()
是什么意思?
这是一个使用带有 2 个子句的模式匹配的匿名函数定义:
- 第一个涵盖案例
(Void, b)
- 第二个涵盖“其他所有内容”:
_
在模式匹配中是匹配任何内容的包罗万象的分支。
当后一个分支在您的代码段中匹配时,该函数将只是 return ()
- 这是 unit
.
所以这个 lambda 函数是一种验证器,如果你有一个错误类型的值(由任何参数化的 Void)并且在其他情况下什么都不做(returns 一个单元),它会引发错误。老实说,这看起来像是一个试图减轻次优类型设计的黑客攻击——我很确定我们可以做得更好,使 (Void, b)
无法表示的状态(但这与所要求的正交)...