OCaml中的空白问题

时间:2011-07-24 21:33:11

标签: whitespace ocaml

我正在尝试学习OCaml,正在阅读Introduction to Objective Caml 我使用OCamlWinPlus v1.9RC4作为我的toploop。

当试图解决关于编程Euclid的原始GCD算法的练习3.4时,我遇到了一个奇怪的问题:在程序中输入时似乎白空间很重要。

我的第一次尝试是:

let rec (%%) n m =
  if m = 0 then
    n
  else
    if n > m then
      (n-m) %% m
    else
      n %% (m-n);;  

给出了类型:

val ( %% ) : int -> int -> 'a = <fun>

嗯...不是我所期待的,而且确实54 %% 24给了无限循环。

经过多次嘲笑之后,我尝试将整个事情放在一行:

let rec (%%) n m = if m = 0 then n else if n > m then (n-m) %% m else n %% (m-n);;

给出了类型:

val ( %% ) : int -> int -> int = <fun>

好多了,这个单行也似乎工作正常。

我想知道是否有人可以解释这种行为? 我试过把parantheses放在不同的地方,但似乎没什么用。 这可能是toploop的一个问题吗?

我希望有人能帮助我,因为在我知道发生了什么之前,我对继续学习这门语言感到不舒服。

编辑:

我尝试将显示的代码片段复制粘贴回OCamlWinPlus,我得到了完全相同的问题结果。

我的系统详情:

  • Windows XP,Home Edition,2002版,Service Pack 3
  • OCaml版本3.11.0。
  • OCamlWinPlus v1.9RC4

1 个答案:

答案 0 :(得分:2)

您测试的代码您要显示的代码。最有可能的是,您测试了没有if m = 0测试的版本,或者使用不同的结果递归调用%%运算符。这可以解释'a返回类型和非终止:'a这里推断的意思是“异常计算”。

有关'a与非终止之间的链接,请参阅Andrew Koenig的文章An anecdote about ML type inference