Dados mutável em OCaml
-
06-07-2019 - |
Pergunta
Eu criei uma estrutura de dados mutáveis ??em OCaml, no entanto, quando eu ir para acessá-lo, ele dá um erro estranho,
Aqui está o meu código
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};;
Quando eu fizer isso em ocaml de nível superior
let x = make _ vec _store;;
e, em seguida, tentar fazer x.size
eu recebo este erro
Error: This expression has type unit -> vec_store
but an expression was expected of type vec_store
O que é parece ser o problema? Eu não posso ver por que isso não iria funcionar.
Obrigado, Faisal
Solução
make_vec_store
é uma função. Quando você diz let x = make_vec_store
, você está definindo x para ser essa função, assim como se você tivesse escrito let x = 1
, que faria x o número 1. O que você deseja é o resultado de chamar essa função. Segundo a definição de make_vec_store
, leva ()
(também conhecido como "unidade") como um argumento, então você escreveria let x = make_vec_store ()
.
Outras dicas
Tente x = make_ vec_store ()
Como seguimento ao excelente answere fornecido. Você pode dizer que o seu exemplo de linha:
# let x = make_vec_store;;
val x : unit -> vec_store = <fun>
retorna uma função como repl irá dizer-lhe isso. Você pode ver a saída que x é do tipo <fun>
que não leva parâmetros unit
e retorna um tipo vec_store
.
Compare isso com a declaração
# let x = 1;;
val x : int = 1
que lhe diz que x é do tipo int eo valor 1.