SML/NJ中的重载冲突
我有以下代码来计算Hofstadter H序列,但是我得到了一条重载冲突错误消息。我是SML的新手,因此我确定错误指的是什么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-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