OCaml中的可变数据

时间:2009-10-27 05:54:42

标签: functional-programming ocaml mutable

我在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 top-level中执行此操作时

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 个答案:

答案 0 :(得分:12)

make_vec_store是一个功能。当您说let x = make_vec_store时,您将x设置为该功能,就像您编写let x = 1一样,这将使x成为数字1.您想要的是调用该函数的结果。根据{{​​1}}的定义,它需要make_vec_store(也称为“单位”)作为参数,因此您可以编写()

答案 1 :(得分:4)

尝试x = make_ vec_store()

答案 2 :(得分:2)

作为后续提供的优秀回答。您可以告诉您的示例行:

# 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。