OCaml中的模式匹配功能

Hoa*_*ang 7 ocaml functional-programming ml

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

let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*erg 11

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

let f x y z = e
Run Code Online (Sandbox Code Playgroud)

只是一个简短的手

let f = function x -> function y -> function z -> e
Run Code Online (Sandbox Code Playgroud)

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

let g = f 3
Run Code Online (Sandbox Code Playgroud)

返回2个参数的函数.

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

let safe_division = function n -> function
                                  | 0 -> failwith "divide by 0"
                                  | m -> n / m
Run Code Online (Sandbox Code Playgroud)


cyg*_*gin 10

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

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

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


小智 7

let safe_division n 
Run Code Online (Sandbox Code Playgroud)

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

function
| 0 -> failwith "divide by 0"
| m -> n / m
Run Code Online (Sandbox Code Playgroud)

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

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