Вы пытаетесь написать функцию с типом 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
Этодовольно неэффективно, но исправление - это часть более продвинутого курса ...