Я пытаюсь изучить OCaml и читаю Введение в Objective Caml
Я использую OCamlWinPlus v1.9RC4 в качестве своего toploop.
При попытке выполнить упражнение 3.4, посвященное программированию оригинального алгоритма GCD Евклида, я столкнулся со странной проблемой: кажется, что при вводе в программу пробел имеет большое значение.
Моя первая попытка была такой:
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>
Намного лучше, и этот однострочный также, кажется, работает правильно.
Я хотел бы знать, может ли кто-нибудь объяснить это поведение?
Я пытался выставить парантезы в разных местах, но ничего не получается.
Может ли это быть проблемой с toploop?
Я надеюсь, что кто-то может помочь мне с этим, так как мне неудобно продолжать изучать этот язык, пока я не узнаю, что происходит.
РЕДАКТИРОВАТЬ:
Я попытался вставить скопированные фрагменты кода обратно в OCamlWinPlus, и я получил точно такой же проблемный результат.
Детали моей системы:
- Windows XP, Home Edition, версия 2002, пакет обновления 3
- OCaml версия 3.11.0.
- OCamlWinPlus v1.9RC4