每个人都可以向我解释这段代码吗?
let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m
当我执行safeDiv 3 0
时,在这种情况下m
和n
是什么?
一般情况下,函数何时匹配第一个和第二个模式?
答案 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
注意fun
和function
略有不同。请参阅:http://caml.inria.fr/pub/docs/manual-ocaml/expr.html#sec121