Изменяемые данные в OCaml - PullRequest
       20

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

3 голосов
/ 27 октября 2009

Я создал изменяемую структуру данных в 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

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

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

Ответы [ 3 ]

12 голосов
/ 27 октября 2009

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

4 голосов
/ 27 октября 2009

try x = make_ vec_store ()

2 голосов
/ 27 октября 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...