关于 OCaml 模式匹配语法

Regarding OCaml Pattern Matching Syntax

我正在关注 this OCaml 教程。

他们提供了下面两个函数,说是等价的

let string_of_int x = match x with
   | 0 -> "zero"
   | 1 -> "one"
   | 2 -> "two"
   | _ -> "many"

let string_of_int2 = function
    | 0 -> "zero"
    | 1 -> "one"
    | 2 -> "two"
    | _ -> "many"

我的查询是关于上述函数的语法。

  1. 我编写了相同的函数,但我只是简单地编写了 0 -> 而不是 | 0 ->,并且该函数仍然以相同的方式工作。本教程在其功能中添加额外的 | 是否有任何特殊原因?

  2. 在第二个函数中,function 关键字的用途是什么?为什么第一个函数中没有此关键字?

  1. 有些人认为它看起来更好、更有条理,而且它允许您使用剪切和粘贴更改案例的顺序,而不必担心哪个没有 |.

  2. function语法是缩写:function [CASES]fun x -> match x with [CASES]相同。有一个微妙的区别,即 function 不可能通过参数名称隐藏另一个变量。

    let string_of_int x = [EXP]本身就是let string_of_int = fun x -> [EXP].

    的缩写

    因此,"canonical" 语法使用 funmatch 非常接近,其他一切都是糖。如果将这两个扩展应用于函数的两个版本,您将看到相同的代码结果(当然是模 alpha 等价 :))。