我正在尝试学习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,我得到了完全相同的问题结果。
我的系统详情:
答案 0 :(得分:2)
您测试的代码不您要显示的代码。最有可能的是,您测试了没有if m = 0
测试的版本,或者使用不同的结果递归调用%%
运算符。这可以解释'a
返回类型和非终止:'a
这里推断的意思是“异常计算”。
有关'a
与非终止之间的链接,请参阅Andrew Koenig的文章An anecdote about ML type inference。