如何将 type int 更改为 'a type? OCaml(河内塔)

How do I change type int to 'a type? OCaml (Towers of Hanoi)

我是 OCaml 的新手。我写了这段关于河内塔的代码。

let rec hanoi (a,b,c) n =
    if n <> 0 then begin
        hanoi (a,c,b) (pred n);
        Printf.printf "%i %i\n" a b;
       hanoi (c,b,a) (pred n) 
  end;;

我打印:a=起点塔和 b=目的地塔。

我想这样做:

hanoi : 'a * 'a * 'a ­> int ­> ('a * 'a) list

如何将 int 类型更改为 'a 类型?有什么方法可以写“类型”吗?我应该使用 List.append 添加一个('列表)吗?

谢谢。

你得到 int 作为 n 类型的原因是因为表达式 n <> 0pred n。这两者都需要 n 成为 int。如果您希望 n 完全是任何类型,则需要对这两个表达式进行多态替换。一种可能性是传入一个测试完成的函数和一个以某种方式递减值的函数。

abc 类型得到 int 的原因是表达式 Printf.printf "%i %i\n" a b,它需要它们成为整数。同样,您可以传入一个函数来打印您的值。

然后你就会遇到为各种类型编写这些函数的问题。

您还说您想要 return 移动列表而不是打印它们。这是一个单独的问题。简短的回答是,您可以将累积列表作为函数的另一个参数传递,并在最后 return 它。

如果我理解正确,那么你的问题是你的函数的推断类型是

(int * int * int) -> int -> unit

你想要的地方

('a * 'a * 'a) -> int -> ('a * 'a) list

钉子的类型被限制为 int,因为您正在打印它们,并且仅当 a 的类型为 int 时才会定义 printf "%i" a。 return 值类型是 unit,因为你的函数不是生成塔,而是打印它。

这是您真正想要的功能:)

let rec hanoi_list n (d,a,i) = match n with |0 -> [] |1 -> [ (d, a) ] |_ -> hanoi_list (n-1) (d,i,a) @ hanoi_list 1 (d,a,i) @ hanoi_list (n-1) (i,a,d);;

希望你能看懂:p