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) 无法表示的状态(但这与所要求的正交)...