SML / NJ中的过载冲突

时间:2019-05-09 16:26:19

标签: 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))));

我的目标是将每次迭代的值插入列表中并显示出来。 例如:H 10; -> [1、2、3、4、4、5、5、6、7]

1 个答案:

答案 0 :(得分:1)

您正在尝试编写类型为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

这效率很低,但是修复是更高级课程的一部分...