出于某种原因,如果我把这些函数一个接一个地放在utop中,它会起作用,但如果我处理所有这些函数,我会出现语法错误(没有任何其他关于可能出错的见解(。
let rec solve = function
| [] -> print_string("")
| a::b -> print_string(a); solve b
let rec read_input acc = function
| 0 -> acc
| n -> let s = read_line() in
read_input (s::acc) (n-1)
let n = read_int() in
let inp = read_input [] n in
solve inp
对我来说,OCaml在下面的第一个in
中指出了一个语法错误(我已经使格式化更加传统(:
let n = read_int() in
let inp = read_input [] n in
solve inp;;
请记住,上面显示的表达式是一个表达式。在上一个绑定之后到达它所在的位置会导致语法错误。让我们通过使它成为另一个顶级绑定来实现它。
let rec solve = function
| [] -> print_string("")
| a::b -> print_string(a); solve b
let rec read_input acc = function
| 0 -> acc
| n -> let s = read_line() in
read_input (s::acc) (n-1)
let () =
let n = read_int() in
let inp = read_input [] n in
solve inp
附带说明一下,使用|>
运算符可以使其更加简洁。
let () =
read_int ()
|> read_input []
|> solve
此外,我觉得read_input
以错误的顺序返回列表:
utop # read_input [] 2;;
3
4
- : string list = ["4"; "3"]
也许你想反转你的蓄能器。
let rec read_input acc = function
| 0 -> List.rev acc
| n -> let s = read_line () in
read_input (s::acc) (n-1)
甚至:
let read_input n =
List.init n (fun _ -> read_line ())