Променливи данни в 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