2013-12-10 7 views
3

Я ищу способ определения глобальных переменных в ocaml, чтобы я мог изменить их значение внутри программы. Глобальная переменная, которую я хочу пользователь:Глобальные переменные в Ocaml

type state = {connected : bool ; currentUser : string};; 
let currentstate = {connected = false ; currentUser = ""};; 

Как я могу изменить значение подключенного и CurrentUser и сохранить новое значение в одной и той же переменной currentstae для всей программы?

+1

время, чтобы прочитать гораздо больше о OCaml. Вам не хватает оснований! –

+1

Я не думаю, что существует политика против простых вопросов, и сообщение здесь [1] гласит, что легкие вопросы в порядке. Вопрос ясен, и вы даже ответили на него. Он не заслуживает просрочки голосования, или ваши комментарии, предлагающие его, не должны были быть заданы. [1] http://meta.stackexchange.com/questions/3251/closing-easy-questions-yes-or-no –

+1

Невозможно назначить переменную в ML. – newacct

ответ

2

Либо объявить изменяемый тип записи:

type state = 
    { mutable connected : bool; mutable currentUser : string };; 

Или объявить глобальную ссылку

let currentstateref = ref { connected = false; currentUser = "" };; 

(обращаться к нему с !currentstateref.connected ...)

И делать разные вещи. Изменчивые поля могут быть мутированы (например, state.connected <- true; ... но запись, содержащая их, остается одинаковой). Ссылки могут быть обновлены (они «указывают на« некоторое новое значение »).

Вам нужно больше часов, чтобы прочитать намного больше вашей книги Ocaml (или ее reference manual). У нас нет времени, чтобы выучить большую часть этого вам.

Ссылка на самом деле, как

type 'a ref = { mutable contents: 'a };; 

, но с синтаксическим сахаром (т.е. инфиксные функций) для разыменования (!) и обновления (:=)

+1

Я бы не думал о '!' И ': =' как синтаксическом сахаре, они просто обычные функции. –

0

тип состояния = {подключен: BOOL; currentUser: string} ;; let currentstate = {connected = false; currentUser = ""} ;;

могут быть переведены:

type state = {connected : bool ref ; currentUser : string ref };; 
let currentstate = {connected = ref false ; currentUser = ref ""};; 

присвоить значение:

(currentstate.connected) := true ;; 
- : unit =() 

получить значение:

!(currentstate.connected) ;; 
- : bool = true 

вы можете также шаблон соответствия по его содержанию.

подробнее о исх here

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