OCaml中的模式匹配功能

时间:2013-05-17 07:14:49

标签: functional-programming ocaml ml

每个人都可以向我解释这段代码吗?

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

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

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

4 个答案:

答案 0 :(得分:11)

一旦你意识到这一点,很容易看出这意味着什么

let f x y z = e

只是

的简写
let f = function x -> function y -> function z -> e

也就是说,n个参数的函数实际上是1个参数的嵌套函数。这种表述被称为“currying”。它允许您部分应用函数,例如

let g = f 3

返回2个参数的函数。

当然,上面的简写可以与右边的显式形式自由混合,这就是你的例子所做的。你可以把它变成:

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

答案 1 :(得分:10)

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

这是function,因此下一个参数0将按顺序与不同的情况进行匹配。这里,它匹配第一种情况,因此评估右侧并抛出异常。在这种情况下,名称m永远不会绑定到任何内容。

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

答案 2 :(得分:7)

let safe_division n 

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

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

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

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

答案 3 :(得分: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