为什么需要“rec”

时间:2016-10-25 12:31:15

标签: ocaml

我定义了以下函数来计算两个数字的最大公约数。

let rec gcd n m = if m = 0 then n else gcd m (n mod m);;

如果没有关键字rec,它将无效。

我很好奇,为什么需要rec

在作用域中没有其他名为gcd的函数,因此很清楚编译器必须调用什么。

即使范围内还有另一个函数gcd,编译器也可以尝试按某种顺序进行匹配,看看是什么样的,就像在Haskell中一样。

你能举例说明为什么这有用吗?

1 个答案:

答案 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中进行编程时,这对我来说总是一个问题,当你意外地使函数递归时,尽管你只是想重载一个现有的函数。