ocaml读取标准输入时出现语法错误



出于某种原因,如果我把这些函数一个接一个地放在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 ())

最新更新