我是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 type?有没有办法写'一种类型?我应该使用List.append来添加('列表)吗?
感谢。
答案 0 :(得分:2)
由于int
和n
的表达式,您n <> 0
的类型pred n
的原因是n
。这两项都需要int
为n
。如果您希望int
完全是任何类型,则需要对这两个表达式进行多态替换。一种可能性是传入一个测试完成的函数和一个以某种方式递减值的函数。
您a
,b
和c
类型获得Printf.printf "%i %i\n" a b
的原因是FIRDataSnapshot
,需要它们要整理。您可以再次传递函数来打印您的值。
然后您遇到了为各种类型编写这些函数的问题。
您还说要返回移动列表而不是打印它们。这是一个单独的问题。简短的回答是,您可以将累积列表作为函数的另一个参数传递,并在最后返回。
答案 1 :(得分:1)
如果我理解正确,那么你的问题是你的函数的推断类型是
(int * int * int) -> int -> unit
你希望它在哪里
('a * 'a * 'a) -> int -> ('a * 'a) list
钉的类型被限制为int
,因为您正在打印它们,并且printf "%i" a
仅在a
类型为int
时定义。返回值类型为unit
,因为您的函数不是生成塔,而是打印它。
答案 2 :(得分:1)
这是你真正想要的功能:)
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