0

我正在尝试创建一个函数,该函数定义一个向量,该向量根据函数的输入而变化,并设置!在 Scheme 中非常适用。在 OCaml 中是否有等效的功能?

4

2 回答 2

4

我同意 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
于 2012-10-14T16:51:56.887 回答
0

set!在 Scheme 中分配给一个变量。您根本无法分配给 OCaml 中的变量。(所以“变量”并不是真正的“变量”。)所以没有等价物。

但是 OCaml 不是一种纯粹的函数式语言。它具有可变的数据结构。可以分配以下内容:

  • 数组元素
  • 字符串元素
  • 记录的可变字段
  • 对象的可变字段

在这些情况下,<-语法用于赋值。

@jrouquie 提到的ref类型是一种简单的内置可变记录类型,它充当一个事物的可变容器。OCaml 还提供了!与s一起使用的:=运算符。ref

于 2012-10-15T18:29:51.223 回答