我定义了以下函数来计算两个数字的最大公约数。
let rec gcd n m = if m = 0 then n else gcd m (n mod m);;
如果没有关键字rec
,它将无效。
我很好奇,为什么需要rec
?
在作用域中没有其他名为gcd
的函数,因此很清楚编译器必须调用什么。
即使范围内还有另一个函数gcd
,编译器也可以尝试按某种顺序进行匹配,看看是什么样的,就像在Haskell中一样。
你能举例说明为什么这有用吗?
答案 0 :(得分:3)
大多数函数都是非递归函数,因此它是合理的,默认情况下,函数名称在其正文中不可见。这也有助于重新定义函数,假设您有module User = struct
type t = {name : string}
let name t = t.name
end
module RespectedUser = struct
include User
let name t = "Mr. " ^ name user
end
函数的模块name
,并且您想在新模块中重新定义它:
name
如果ConsoleClass console = new ConsoleClass(textArea);
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
public class ConsoleClass extends OutputStream {
private TextArea output;
public ConsoleClass(TextArea ta) {
this.output = ta;
}
@Override
public void write(int i) throws IOException {
output.appendText(String.valueOf((char) i));
}
@Override
public void write(byte[] b) throws IOException {
output.appendText(String.valueOf(b);
}
}
名称(该示例的函数名称的错误选择)在正文中可见,则实现session.SetOutputStream(ps) //Nothing gets displayed
函数将更加困难。它会更频繁地阻碍,然后实际需要它。在Haskell中进行编程时,这对我来说总是一个问题,当你意外地使函数递归时,尽管你只是想重载一个现有的函数。