【问题标题】:What does `_ -> ()` mean in OCaml function?OCaml 函数中的 `_ -> ()` 是什么意思?
【发布时间】:2021-12-27 08:44:15
【问题描述】:

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

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

_ -> () 是什么意思?

【问题讨论】:

  • 看起来 check_binds 如果绑定中有任何 Void 会引发错误,否则不会返回任何感兴趣的内容。
  • 一些风格注释:这里有一些真正的缩进,你的check_binds 函数可以在没有显式类型注释的情况下推断其参数的类型。您不妨查看OCaml Programming Guidelines

标签: function syntax compiler-construction ocaml ocamlyacc


【解决方案1】:

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

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

当后一个分支在您的 sn-p 中匹配时,该函数将只返回 () - 这是 unit 类型的唯一可能值。

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

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2011-11-23
    • 1970-01-01
    • 2016-08-26
    • 2010-12-27
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多