我正在尝试创建一个函数,该函数定义一个向量,该向量根据函数的输入而变化,并设置!在 Scheme 中非常适用。在 OCaml 中是否有等效的功能?
2 回答
我同意 sepp2k 你应该扩展你的问题,并给出更详细的例子。
也许您需要的是参考资料。
作为粗略的近似,您可以将它们视为可以分配的变量:
let a = ref 5;;
!a;; (* This evaluates to 5 *)
a := 42;;
!a;; (* This evaluates to 42 *)
这是来自http://caml.inria.fr/pub/docs/u3-ocaml/ocaml-core.html的更详细的解释:
到目前为止我们描述的语言是纯粹的函数式的。也就是说,对同一个表达式的多次评估总是会产生相同的答案。例如,这可以防止实现其接口是单个函数的计数器,该函数next : unit -> int
递增计数器并返回其新值。重复调用此函数应返回一系列连续整数——每次都有不同的答案。
实际上,计数器需要通过读/写访问来记住它在某个特定位置的状态,但首先,必须在两次调用 next 之间共享一些信息。解决方案是使用可变存储并通过所谓的副作用与存储进行交互。
在 OCaml 中,计数器可以定义如下:
let new_count =
let r = ref 0 in
let next () = r := !r+1; !r in
next;;
另一个可能更具体的可变存储示例是银行帐户。在 OCaml 中,记录字段可以声明为可变的,以便以后可以为它们分配新值。因此,银行账户可以是一个包含两个字段的记录,即其编号和余额,其中余额是可变的。
type account = { number : int; mutable balance : float }
let retrieve account requested =
let s = min account.balance requested in
account.balance <- account.balance -. s; s;;
事实上,在 OCaml 中,引用不是原始的:它们是可变记录的特例。例如,可以定义:
type 'a ref = { mutable content : 'a }
let ref x = { content = x }
let deref r = r.content
let assign r x = r.content <- x; x
set!
在 Scheme 中分配给一个变量。您根本无法分配给 OCaml 中的变量。(所以“变量”并不是真正的“变量”。)所以没有等价物。
但是 OCaml 不是一种纯粹的函数式语言。它具有可变的数据结构。可以分配以下内容:
- 数组元素
- 字符串元素
- 记录的可变字段
- 对象的可变字段
在这些情况下,<-
语法用于赋值。
@jrouquie 提到的ref
类型是一种简单的内置可变记录类型,它充当一个事物的可变容器。OCaml 还提供了!
与s一起使用的:=
运算符。ref