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,什么是m与n在这种情况下?
一般情况下,函数何时匹配第一个和第二个模式?
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是结果.