大家可以给我解释一下这段代码吗?
let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m
当我执行时safeDiv 3 0
,在这种情况下m
and是什么?n
在一般情况下,函数何时匹配第一个和第二个模式?
大家可以给我解释一下这段代码吗?
let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m
当我执行时safeDiv 3 0
,在这种情况下m
and是什么?n
在一般情况下,函数何时匹配第一个和第二个模式?
一旦意识到这一点,就很容易理解这意味着什么
let f x y z = e
只是一个简写形式
let f = function x -> function y -> function z -> e
也就是说,n 个参数的函数实际上是 1 个参数的 n 个嵌套函数。这种表示称为“currying”。它允许您部分应用功能,例如
let g = f 3
返回一个有 2 个参数的函数。
当然,上面的简写可以与右边的显式形式自由混合,这就是您的示例所做的。您可以将其脱糖成:
let safe_division = function n -> function
| 0 -> failwith "divide by 0"
| m -> n / m
当您执行safe_division 3 0
时,首先3
绑定到名称n
,然后评估声明的右侧。
这是 a function
,因此下一个参数 ,0
按顺序匹配不同的情况。在这里,它匹配第一种情况,因此评估右侧并引发异常。在这种情况下,名称m
永远不会绑定到任何东西。
例如,如果第二个参数是 ,1
那么它将匹配第二种情况(这种情况无论如何都匹配所有可能的值,这是默认情况),将名称绑定m
到值1
,然后返回n / m
.
let safe_division n
定义一个类型为 int -> ... 的函数
function
| 0 -> failwith "divide by 0"
| m -> n / m
定义一个类型为 int -> int 的函数
所以整体的结果类型是int -> int -> int其中 n 是第一个参数, m 是第二个。最后一个 int 是结果。
let safe_division 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
略有不同。见:http ://caml.inria.fr/pub/docs/manual-ocaml/expr.html#sec121