0

我正在查看这段代码(前两行是上下文的伪代码)

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)
| _ -> ()

是什么_ -> ()意思?

4

1 回答 1

4

这是使用带有 2 个子句的模式匹配的匿名函数定义:

  • 第一个涵盖案例(Void, b)
  • 第二个涵盖“其他所有内容”:_在模式匹配中是一个匹配任何内容的包罗万象的分支。

当后一个分支在您的代码段中匹配时,该函数将返回()- 这是 type 的唯一可能值unit

所以这个 lambda 函数是一种验证器,如果你有一个错误类型的值(由任何东西参数化的 Void)会引发错误,而在其他情况下什么也不做(返回一个单位)。老实说,这看起来像是一种试图减轻次优类型设计的黑客行为——我很确定我们可以做得更好并制作不可表示(Void, b)的状态(但这与所要求的内容正交)......

于 2021-12-27T09:16:04.290 回答