OCaml :: Считать список целых чисел из консоли и распечатать обратно - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть список целых чисел (я не знаю, сколько) на консоли, например, так:

3
10
9
8
2
7
5
1
3
0

Я хочу прочитать их в список и распечатать их в порядке, как они былипрочитайте. Пока я пробовал следующее, но оно не работает.

let rec read_nums arr = (*takes an initial array*)
     try 
         let i = read_int () in (*read next integer*)
              read_nums (i::arr) (*append to array and recurse*)
     with End_of_file -> arr (*return array if everything has been read*)

let input = (read_nums []) (*call the function*)

(*destruct the list, print head, recurse*)
let rec print_input array = match arr with 
   | hd::tl -> (print_int hd; print_input tl;)
   | [] -> ()

(*call the function*)
print_input input

Сбой со следующей ошибкой

File "solution.ml", line 15, characters 12-17:
Error: Syntax error

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Добавить let () = ... до выражения верхнего уровня.

Ваша синтаксическая ошибка пришла из последней строки:

let rec print_input arr =
  match arr with
  | hd::tl -> (print_int hd; print_input tl)
  | [] -> ()

print_input input  (* this line! *)

Здесь, похоже, print_input input является приложением функции вОднако на верхнем уровне это также может быть приложение-конструктор () print_input, как показано ниже:

let rec print_input arr =
  match arr with
  | hd::tl -> (print_int hd; print_input tl)
  | [] -> () print_input input

Грубо говоря, синтаксический анализатор OCaml сначала думает, что это приложение-конструктор, но затем input остается один, поэтомувозникает ошибка.

Чтобы избежать этого, вы можете использовать let () = ...:

let rec print_input arr =
  match arr with
  | hd::tl -> (print_int hd; print_input tl)
  | [] -> ()

let () =
  print_input input

При таком соглашении все выражения верхнего уровня исчезают.Кроме того, это делает наши программы более безопасными, поскольку требует, чтобы тип возвращаемого выражения был unit.

Подробнее см. В этом руководстве по OCaml: Структура программ OCaml

0 голосов
/ 25 декабря 2018

В будущем:

  • Минимизируйте свой код.Одна и та же ошибка воспроизводится в двух строках.
  • Удалить номера строк.Они затрудняют вставку и запуск кода.

Об ошибке: кажется, что привязка OCaml let имеет форму let ... in expr.Следующие работы:

let rec read_nums arr = (*takes an initial array*)
    try 
        let i = read_int () in (*read next integer*)
            read_nums (i::arr) (*append to array and recurse*)
    with End_of_file -> arr (*return array if everything has been read*)
    in

let input = (read_nums [1; 2]) in (*call the function*)

(*destruct the list, print head, recurse*)
let rec print_input arr = match arr with 
    | hd::tl -> (print_int hd; print_input tl;)
    | [] -> ()
    in

print_input input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...