7

大家可以给我解释一下这段代码吗?

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

当我执行时safeDiv 3 0,在这种情况下mand是什么?n

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

4

4 回答 4

11

一旦意识到这一点,就很容易理解这意味着什么

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
于 2013-05-17T09:18:45.780 回答
10

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

这是 a function,因此下一个参数 ,0按顺序匹配不同的情况。在这里,它匹配第一种情况,因此评估右侧并引发异常。在这种情况下,名称m永远不会绑定到任何东西。

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

于 2013-05-17T08:27:28.140 回答
7
let safe_division n 

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

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

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

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

于 2013-05-17T08:05:50.693 回答
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略有不同。见:http ://caml.inria.fr/pub/docs/manual-ocaml/expr.html#sec121

于 2015-03-24T05:35:12.753 回答