关于 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"
我的查询是关于上述函数的语法。
我编写了相同的函数,但我只是简单地编写了 0 ->
而不是 | 0 ->
,并且该函数仍然以相同的方式工作。本教程在其功能中添加额外的 |
是否有任何特殊原因?
在第二个函数中,function
关键字的用途是什么?为什么第一个函数中没有此关键字?
有些人认为它看起来更好、更有条理,而且它允许您使用剪切和粘贴更改案例的顺序,而不必担心哪个没有 |
.
function
语法是缩写:function [CASES]
与fun x -> match x with [CASES]
相同。有一个微妙的区别,即 function
不可能通过参数名称隐藏另一个变量。
let string_of_int x = [EXP]
本身就是let string_of_int = fun x -> [EXP]
.
的缩写
因此,"canonical" 语法使用 fun
和 match
非常接近,其他一切都是糖。如果将这两个扩展应用于函数的两个版本,您将看到相同的代码结果(当然是模 alpha 等价 :))。
我正在关注 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"
我的查询是关于上述函数的语法。
我编写了相同的函数,但我只是简单地编写了
0 ->
而不是| 0 ->
,并且该函数仍然以相同的方式工作。本教程在其功能中添加额外的|
是否有任何特殊原因?在第二个函数中,
function
关键字的用途是什么?为什么第一个函数中没有此关键字?
有些人认为它看起来更好、更有条理,而且它允许您使用剪切和粘贴更改案例的顺序,而不必担心哪个没有
|
.function
语法是缩写:function [CASES]
与fun x -> match x with [CASES]
相同。有一个微妙的区别,即function
不可能通过参数名称隐藏另一个变量。
的缩写let string_of_int x = [EXP]
本身就是let string_of_int = fun x -> [EXP]
.因此,"canonical" 语法使用
fun
和match
非常接近,其他一切都是糖。如果将这两个扩展应用于函数的两个版本,您将看到相同的代码结果(当然是模 alpha 等价 :))。