Functional programming 在OCaml中将列表[1,2,3]提前到[3,1,2]

Functional programming 在OCaml中将列表[1,2,3]提前到[3,1,2],functional-programming,ocaml,Functional Programming,Ocaml,我试图编写一个简单的OCaml程序来推进向量,即[1,2,3]到[3,1,2],依此类推: open Printf let advance_list list = match list with |[] -> [] |h::t -> t::h let () = List.iter (printf "%d ") (advance_list [1;2;3]) 但我明白了 File "rotate_vector.ml", line 13, charact

我试图编写一个简单的OCaml程序来推进向量,即[1,2,3]到[3,1,2],依此类推:

open Printf

let advance_list list =
    match list with 
    |[]   -> []
    |h::t -> t::h

let () = List.iter (printf "%d ") (advance_list [1;2;3])
但我明白了

File "rotate_vector.ml", line 13, characters 16-17:
13 |     |h::t -> t::h
                     ^
Error: This expression has type 'a but an expression was expected of type
         'a list list
       The type variable 'a occurs inside 'a list list

我不理解这个错误。对我来说,我返回附加到
h
开头的第一个元素,这是一个列表,没有第一个元素,它是
t
列表的头和尾不是同一类型。对于类型为
t list
的列表,列表的开头是类型为
t
,但列表的结尾是类型为
t list
。换句话说,列表的尾部也是一个列表

因此,您不能使用
操作符来切换它们。您需要在左侧使用
t
类型的东西,在右侧使用
t list
类型的东西


无论如何,您需要在列表的末尾而不是开头拆分列表。为此,你需要一些更复杂的东西。我可以想象一个函数遍历列表,跟踪到目前为止看到的内容(列表的开头),然后在结束时将结果放在一起。

列表的头和尾不是同一类型。对于类型为
t list
的列表,列表的开头是类型为
t
,但列表的结尾是类型为
t list
。换句话说,列表的尾部也是一个列表

let get_last_elt l = 
 let list_rev = List.rev l in
  match list_rev with 
  [] -> failwith "The list is empty"
  |h::t -> let end_of_list = h in end_of_list

let delete_last_elt l = 
 let list_rev = List.rev l in
  match list_rev with 
  [] -> failwith "The list is empty"
  |h::t -> List.rev t

let advance_list l = 
 let end_of_list = get_last_elt l in
  match l with
  [] -> failwith "The list is empty"
  |h::t -> [end_of_list]@(delete_last_elt l)
因此,您不能使用
操作符来切换它们。您需要在左侧使用
t
类型的东西,在右侧使用
t list
类型的东西

无论如何,您需要在列表的末尾而不是开头拆分列表。为此,你需要一些更复杂的东西。我可以想象一个遍历列表的函数,跟踪到目前为止看到的内容(列表的开头),然后在结束时将结果放在一起

let get_last_elt l = 
 let list_rev = List.rev l in
  match list_rev with 
  [] -> failwith "The list is empty"
  |h::t -> let end_of_list = h in end_of_list

let delete_last_elt l = 
 let list_rev = List.rev l in
  match list_rev with 
  [] -> failwith "The list is empty"
  |h::t -> List.rev t

let advance_list l = 
 let end_of_list = get_last_elt l in
  match l with
  [] -> failwith "The list is empty"
  |h::t -> [end_of_list]@(delete_last_elt l)
我希望这有帮助


我希望这有帮助

您必须使用列表连接运算符。@G4143
h@[t]
rigth?我只是注意到我没有做运动所做的。你知道如何匹配而不是
first:rest
,而是
rest:last
?我需要选择最后一个元素并放在前面,尝试将问题分解成更小的部分。首先编写一个函数以获取最后一个元素,然后扩展该函数以返回最后一个元素以及列表中没有最后一个元素的其余部分,然后使用该函数将最后一个元素放在第一位。您必须使用列表连接运算符。@G4143
h@[t]
rigth?我只是注意到我没有做运动所做的。你知道如何匹配而不是
first:rest
,而是
rest:last
?我需要选择最后一个元素并放在前面,尝试将问题分解成更小的部分。首先编写一个函数以获取最后一个元素,然后扩展该函数以返回最后一个元素以及列表中没有最后一个元素的其余部分,然后使用该函数编写一个函数以将最后一个元素放在第一位。