Functional programming OCaml中的模式匹配函数

Functional programming OCaml中的模式匹配函数,functional-programming,ocaml,ml,Functional Programming,Ocaml,Ml,大家能给我解释一下这段代码吗 let safe_division n = function | 0 -> failwith "divide by 0" | m -> n / m 当我执行safeDiv 3 0时,在这种情况下m和n是什么 一般情况下,函数何时匹配第一个和第二个模式 let safe_division n 定义一个类型为int->的函数 function | 0 -> failwith "divide by 0" | m -> n / m 定义一个类

大家能给我解释一下这段代码吗

let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m
当我执行
safeDiv 3 0
时,在这种情况下
m
n
是什么

一般情况下,函数何时匹配第一个和第二个模式

let safe_division n 
定义一个类型为int->的函数

function
| 0 -> failwith "divide by 0"
| m -> n / m
定义一个类型为int->int的函数


因此,整体的结果类型是int->int->int,其中n是第一个参数,m是第二个参数。最后一个int是结果。

当执行
safe\u第3部分0
时,首先,
3
绑定到名称
n
,然后计算声明的右侧

这是一个
函数
,因此下一个参数
0
,按顺序匹配不同的情况。在这里,它与第一种情况匹配,因此计算右侧并抛出异常。在这种情况下,名称
m
永远不会绑定到任何东西


例如,如果第二个参数是
1
,则它将匹配第二种情况(无论如何,这种情况匹配所有可能的值,这是默认情况),将名称
m
绑定到值
1
,然后返回
n/m

的结果,一旦意识到这一点,就很容易看出这意味着什么

let f x y z = e
这只是一个简写

let f = function x -> function y -> function z -> e
也就是说,一个有n个参数的函数实际上是一个参数的n个嵌套函数。这种表现被称为“咖喱”。它允许您部分应用功能,例如

let g = f 3
返回一个包含2个参数的函数

当然,上面的速记可以与右边的显式形式自由混合,这就是您的示例所做的。您可以将其分解为:

let safe_division = function n -> function
                                  | 0 -> failwith "divide by 0"
                                  | m -> n / m
仅相当于:

let safe_division n = fun x -> match x with
| 0 -> failwith "divide by 0"
| m -> n / m
注意
fun
function
略有不同。见:

let safe_division n = fun x -> match x with
| 0 -> failwith "divide by 0"
| m -> n / m