您正在尝试编写类型为 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
这是非常低效的,但修复它是更高级课程的一部分...