Конфликт перегрузки в SML / NJ - PullRequest
1 голос
/ 09 мая 2019

У меня есть следующий код для вычисления H-последовательности Hofstadter, но я получаю сообщение об ошибке конфликта перегрузки. Я довольно новичок в SML, поэтому я уверен, что ошибка относится к.

(* Hofstadter H-Sequence *)
fun H(0) = [0]
| H(n) = if  n = 0 then [0] else x :: (n - H(H(H(n - 1))));

Моя цель - вставить значение каждой итерации в список и отобразить его. Пример: Н 10; -> [1, 1, 2, 3, 4, 4, 5, 5, 6, 7]

1 Ответ

1 голос
/ 09 мая 2019

Вы пытаетесь написать функцию с типом int -> int list.

(Хорошая идея думать о типах во время написания, даже если SML их выведет. Хорошая система типов похожа на автофокус для ума.)

Вы не можете вычестьрезультат этой функции из числа (n - H(...)), так как это список, и вы не можете передать список этой функции - H(H(n - 1)) - так как она хочет число.
(И где появился первый элемент,x, откуда?)

Начните с простого, с функцией, которая является просто определением H(n):

fun H 0 = 0
  | H n = n - H(H(H(n-1)))

Тест:

- H 0;
val it = 0 : int
- H 1;
val it = 1 : int
- H 2;
val it = 1 : int
- H 4;
val it = 3 : int

Тогдаиспользуйте это для построения списка постепенно.
Этот вариант использует локально определенную вспомогательную функцию, которая использует текущий индекс и счетчик:

fun H_seq n = let fun H_seq' m e =
                      if m < e
                      then (H m) :: (H_seq' (m+1) e)
                      else []
              in
                  H_seq' 0 n
              end;

Пример:

- H_seq 10;
val it = [0,1,1,2,3,4,4,5,5,6] : int list

Этодовольно неэффективно, но исправление - это часть более продвинутого курса ...

...