大家能帮我解释一下这段代码吗?
let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m
当我执行 safeDiv 3 0
时,这种情况下的 m
和 n
是什么?
通常情况下,函数何时匹配第一个和第二个模式?
大家能帮我解释一下这段代码吗?
let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m
当我执行 safeDiv 3 0
时,这种情况下的 m
和 n
是什么?
通常情况下,函数何时匹配第一个和第二个模式?
一旦你意识到这意味着什么,那么这就很容易理解了。
let f x y z = e
仅仅是一个简写形式
let f = function x -> function y -> function z -> e
也就是说,一个有n个参数的函数实际上是由n个嵌套的单参数函数组成的。这种表示方法称为“柯里化”。它使你能够部分应用一个函数,例如:
let g = f 3
返回一个带有两个参数的函数。
当然,上述简写可以随意与右侧的显式形式混合使用,这就是你的示例所做的。您可以将其还原为:
let safe_division = function n -> function
| 0 -> failwith "divide by 0"
| m -> n / m
当你执行 safe_division 3 0
时,首先,3
被绑定到名称 n
,然后对声明的右侧进行评估。
这是一个 函数
,所以下一个参数 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
略有不同。参见:函数定义。