2014-01-27 3 views
0

У меня есть следующий код заявление:OCaml - Как поставить привязку let в выражении соответствия?

let execute command = 
match command with 
|Skip ->() 
|Changestate (l,r) -> (let l = ref r) 
|_ -> failwith "Not a command" 

, когда я запускаю это в верхнем уровне, я получаю следующее сообщение об ошибке:

1 let execute command = 
2 match command with 
3 |Skip ->() 
4 |Changestate (l,r) -> (let l = ref r) 
5 |_ -> failwith "Not a command";; 
6 Error: Syntax error 

Ошибка синтаксиса, как представляется, происходит в круглых скобках в конце строка 4. Что бы я хотел, чтобы эта строка была сделана, это изменить значение в l на ссылочную переменную на r, но не вернуть фактическое значение.

+1

Я предполагаю, что вы хотите сделать это l: = r, но мы не уверены, так как вы не предоставляете определение типа команды. – camlspotter

+0

Это именно то, что я хотел сделать. Я отказался от типа def, чтобы попытаться сохранить пример коротким. Благодаря! –

ответ

2

Хорошо, camlspotter уже дал отличный ответ, но вот что я собирался сказать.

Во-первых, нет выражения OCaml let var = expr, за исключением верхнего уровня модуля, где он определяет экспортированные имена модуля.

Во всех других местах выражение выглядит как let var = expr1 in expr2. Поэтому ваш код не так синтаксически, как компилятор говорит вам.

Во-вторых, даже если ваш код был синтаксически правильно, выражение let l ... определяет новую переменную l с никакого отношения к одному в шаблоне непосредственно перед ним.

В-третьих, вы не даете типов вещей, так что вам трудно помочь (точно, как говорит camlspotter). Но, вообще говоря, вы не можете изменить значение l. Идентификатор в OCaml неизменно связан с его значением.

Если l привязано (неизменно!) К ссылке нужного типа, вы можете установить значение в ссылке с помощью выражения l := r.

+0

Спасибо за подробное объяснение Джеффри! –