我正在尝试创建一个函数来定义一个基于函数输入而变化的向量,然后设置!在Scheme中很有用。在OCaml中是否存在功能等同的功能?
答案 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)
set!
分配给变量。根本无法在OCaml中分配变量。 (所以“变量”实际上不是“变量”。)所以没有等价物。
但OCaml不是纯粹的功能语言。它具有可变数据结构。可以分配以下内容:
在这些情况下,<-
语法用于分配。
@jrouquie提到的ref
类型是一个简单的内置可变记录类型,它充当一个可变容器。 OCaml还提供!
和:=
运营商来处理ref
。