OCaml中的等效函数是否与“set!”的工作方式相同?在Scheme?

时间:2012-10-14 16:20:33

标签: scheme ocaml assignment-operator

我正在尝试创建一个函数来定义一个基于函数输入而变化的向量,然后设置!在Scheme中很有用。在OCaml中是否存在功能等同的功能?

2 个答案:

答案 0 :(得分: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,它使计数器递增并返回其新值。重复调用此函数应该返回一系列连续的整数 - 每次都有不同的答案。

实际上,计数器需要在某个特定位置记忆其状态,具有读/写访问权限,但最重要的是,必须在两次下一次调用之间共享一些信息。解决方案是使用可变存储并通过所谓的副作用与商店进行交互。

在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

答案 1 :(得分:0)

Scheme中的

set!分配给变量。根本无法在OCaml中分配变量。 (所以“变量”实际上不是“变量”。)所以没有等价物。

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

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

在这些情况下,<-语法用于分配。

@jrouquie提到的ref类型是一个简单的内置可变记录类型,它充当一个可变容器。 OCaml还提供!:=运营商来处理ref