OCaml中的模式匹配函数

9

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

let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m

当我执行 safeDiv 3 0 时,这种情况下的 mn 是什么?

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

4个回答

14

一旦你意识到这意味着什么,那么这就很容易理解了。

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

11

当你执行 safe_division 3 0 时,首先,3 被绑定到名称 n,然后对声明的右侧进行评估。

这是一个 函数,所以下一个参数 0 将按顺序与不同的情况匹配。在这里,它匹配第一种情况,因此右侧被评估并且抛出异常。在这种情况下,名称 m 没有绑定任何内容。

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


7
let safe_division n 

定义一个类型为int的函数 -> ...

function
| 0 -> failwith "divide by 0"
| m -> n / m

定义一个类型为 int -> int 的函数。

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


1
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

注意funfunction略有不同。参见:函数定义


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接