【问题标题】:Overload Conflict in SML/NJSML/NJ 中的过载冲突
【发布时间】:2019-05-10 03:09:44
【问题描述】:

我有以下代码来计算 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, 1, 2, 3, 4, 4, 5, 5, 6, 7]

【问题讨论】:

    标签: sml smlnj


    【解决方案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
    

    这是非常低效的,但修复它是更高级课程的一部分...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 2010-10-23
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      相关资源
      最近更新 更多