SML/NJ中的重载冲突

SML/NJ中的重载冲突,sml,smlnj,Sml,Smlnj,我有以下代码来计算Hofstadter H序列,但是我得到了一条重载冲突错误消息。我是SML的新手,因此我确定错误指的是什么 (* Hofstadter H-Sequence *) fun H(0) = [0] | H(n) = if n = 0 then [0] else x :: (n - H(H(H(n - 1)))); 我的目标是将每个迭代的值插入一个列表并显示它。 例:h10;-->[1,1,2,3,4,4,5,5,6,7]您正在尝试使用int->int list类型编写函数 (写

我有以下代码来计算Hofstadter H序列,但是我得到了一条重载冲突错误消息。我是SML的新手,因此我确定错误指的是什么

(* Hofstadter H-Sequence *)
fun H(0) = [0]
| H(n) = if  n = 0 then [0] else x :: (n - H(H(H(n - 1))));
我的目标是将每个迭代的值插入一个列表并显示它。
例:h10;-->[1,1,2,3,4,4,5,5,6,7]

您正在尝试使用
int->int list
类型编写函数

(写作时考虑类型是个好主意,即使SML会推断出来。一个好的类型系统就像大脑的自动聚焦。)

您不能从数字(
n-H(…)
)中减去此函数的结果,因为它是一个列表,也不能将列表传递给此函数–
H(H(n-1))
,因为它需要一个数字。
(第一个元素,
x
来自哪里?)

从一个简单的函数开始,这个函数只是
H(n)
的定义:

测试:

然后使用它以增量方式构建列表。
此变体使用本地定义的辅助函数,该函数使用当前索引和计数器:

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 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