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