Изменяемые данные в OCaml

Я создал изменяемую структуру данных в OCaml, однако, когда я обращаюсь к ней, выдает странную ошибку,

Вот мой код

type vector = {a:float;b:float};;
type vec_store = {mutable seq:vector array;mutable size:int};;

let max_seq_length = ref 200;;

exception Out_of_bounds;;
exception Vec_store_full;;

let vec_mag {a=c;b=d} = sqrt( c**2.0 +. d**2.0);;


let make_vec_store() = 
    let vecarr = ref ((Array.create (!max_seq_length)) {a=0.0;b=0.0}) in
         {seq= !vecarr;size=0};;

Когда я делаю это на верхнем уровне ocaml

let x = make _ vec _store;;

а затем попробуйте сделать x.size я получаю эту ошибку

Error: This expression has type unit -> vec_store
       but an expression was expected of type vec_store

В чем проблема? Я не понимаю, почему это не сработает.

Спасибо, Фейсал


person Faisal Abid    schedule 27.10.2009    source источник


Ответы (3)


make_vec_store — это функция. Когда вы говорите let x = make_vec_store, вы устанавливаете x как эту функцию, точно так же, как если бы вы написали let x = 1, это сделало бы x числом 1. То, что вы хотите, — это результат вызова этой функции. Согласно определению make_vec_store, в качестве аргумента принимается () (также известное как «единица измерения»), поэтому вы должны написать let x = make_vec_store ().

person Chuck    schedule 27.10.2009
comment
ааа Очень очень хорошее объяснение! Я знал, что что-то идет не так, так как этот код работал раньше. Большое спасибо! - person Faisal Abid; 27.10.2009

попробуйте x = make_ vec_store()

person swegi    schedule 27.10.2009

В качестве продолжения отличного ответа. Вы можете сказать, что ваша примерная строка:

# let x = make_vec_store;;
val x : unit -> vec_store = <fun>

возвращает функцию, поскольку repl скажет вам об этом. Из вывода видно, что x имеет тип <fun>, не принимает параметров unit и возвращает тип vec_store.

Сравните это с декларацией

# let x = 1;;
val x : int = 1

который говорит вам, что x имеет тип int и значение 1.

person chollida    schedule 27.10.2009