List 奥卡姆河内塔

List 奥卡姆河内塔,list,recursion,ocaml,tuples,towers-of-hanoi,List,Recursion,Ocaml,Tuples,Towers Of Hanoi,我是一名OCaml初学者,试图在OCaml中创建一个函数来解决河内塔问题。在该解决方案中,由一个移动列表表示,其中“移动”存储在一个元组中(startPeg,endPeg) 这就是我到目前为止所做的: type peg = A | B | C type move = peg * peg let towers (m : int) : (move list) = let rec solve n a b c = match n with |0 -> [] |_ -> (so

我是一名OCaml初学者,试图在OCaml中创建一个函数来解决河内塔问题。在该解决方案中,由一个移动列表表示,其中“移动”存储在一个元组中(startPeg,endPeg)

这就是我到目前为止所做的:

type peg = A | B | C
type move = peg * peg


let towers (m : int) : (move list) =
  let rec solve n a b c = match n with
  |0 -> []
  |_ -> (solve (n-1) a c b) :: (a,b) :: (solve (n-1) c b a) in
  solve m A B C 
我得到一个错误:

文件“inclution.ml”,第8行,字符8-27: 错误:此表达式的类型为“a列表” 但应为“a”类型的表达式 类型变量“a出现在”列表中

我也不知道如何修复它。
有人能帮我改正错误吗?谢谢

操作员
在列表的开头添加一个元素。您正在使用它连接列表。如果将第一个
更改为列表串联运算符
@
,则代码将编译

type peg = A | B | C
type move = peg * peg


let towers (m : int) : (move list) =
  let rec solve n a b c = match n with
  |0 -> []
  |_ -> (solve (n-1) a c b) @ (a,b) :: (solve (n-1) c b a) in
  solve m A B C 

我不知道生成的代码是否正确,但我希望这能让您重新开始。

运算符
在列表的开头添加一个元素。您正在使用它连接列表。如果将第一个
更改为列表串联运算符
@
,则代码将编译

type peg = A | B | C
type move = peg * peg


let towers (m : int) : (move list) =
  let rec solve n a b c = match n with
  |0 -> []
  |_ -> (solve (n-1) a c b) @ (a,b) :: (solve (n-1) c b a) in
  solve m A B C 

我不知道生成的代码是否正确,但我希望这能让您重新开始。

关闭主题会很好。关闭主题会很好。