2016-04-28 3 views
0

В чем проблема с кодом ниже? Я изо всех сил пытаюсь понять, когда использовать ';' или ';;' или использовать начало в OCaml. Здесь мне нужно прочитать некоторые ребра и вставить в график, но мне нужно связать это с остальной программой, чтобы он мог использовать g (график) со всеми ребрами. Когда я сделать это он говорит об ошибке: Синтаксическая ошибкасинтаксическая ошибка во время цикла в OCaml

let i = ref n in 
while !i > 0 do 
( 
    let pair = read_edge Scanning.stdin in 
    let g = insert_edge (fst pair) (snd pair) g in 
    i := !i - 1 
) 
done in (* giving error in this line *) 

let rec do_stuff l = 
    match l with 
    | [] ->() 
    | h::t -> print_int h;do_stuff t in 

(* more functions) 

ответ

2

in является частью синтаксиса let (это "let" pattern "in" expression). Синтаксис цикла while - это просто "while" expression "do" expression "done", поэтому там нет in.

Для компиляции кода вы можете заменить in на ;, поэтому он выполняет цикл while, за которым следует выражение let после него. Однако мне кажется странным, что у вас будет цикл while между набором определений функций.

Также обратите внимание, что в цикле вы делаете let g = ..., но тогда вы не используете g в любом месте тела let. Так что привязка ничего не выполняет.

+0

Фактически, ';' является только синтаксическим сахаром для 'let() = in', если я не ошибаюсь. – RichouHunter

+0

Моя идея 'let g = ....' состояла в том, чтобы обновлять g, чтобы при завершении цикла его можно было использовать остальной частью программы. Я хотел связать его с 'done in', если я не могу это сделать, как я могу это решить? Я думаю, что видел «сделано раньше», но теперь, когда я думаю об этом, он был в цикле for не в цикле while. –

+0

@power_output Единственный способ, которым вы могли бы видеть 'done in', был бы, если бы цикл использовался как значение в выражении' let', то есть 'let something = while cond do ... done in ...'. Во всяком случае, 'let' создает новую переменную - она ​​не влияет на значение существующей переменной (которую вы не можете сделать). Если вы хотите переназначить что-то, вам понадобится 'ref' (или что-нибудь с изменяемым членом). – sepp2k

Смежные вопросы