Проблемы с пробелами в OCaml - PullRequest
1 голос
/ 25 июля 2011

Я пытаюсь изучить 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

1 Ответ

2 голосов
/ 26 июля 2011

Код, который вы протестировали, это , а не код, который вы показываете. Скорее всего, вы тестировали версию без теста if m = 0 или с другим результатом, рекурсивно вызывая оператор %%. Это объясняет как тип возврата 'a, так и отсутствие завершения: 'a, выведенное здесь, означает «ненормальное вычисление».

По поводу связи между 'a и прекращением см. Статью Эндрю Кенига Анекдот о выводе типа ML .

...