2012-10-14 39 views
0

我试图做一个函数,定义一个矢量,根据函数的输入而变化,并设置!在Scheme中很有用。 OCaml中有这个功能吗?OCaml中是否存在与“set!”相同的函数?在计划?

+0

你的意思是'set!'或'vector-set!'?如果你的意思是'set!',你能描述一下你在描述的场景中如何使用'set!'? – sepp2k

+0

我的意思是“set!”什么,我试图做会去像这样一个简单的例子: (定义四个 4) (定义五(设4 5)!) – Balthasar

+0

^^^所以现在“四个一”被设定为5 – Balthasar

回答

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 
+0

这正是我正在寻找的!谢谢! – Balthasar

0

set!在Scheme中赋值给一个变量。根本不能在OCaml中分配变量。 (所以“变量”并不是真的“可变的”)。所以没有相应的东西。

但OCaml不是一种纯粹的功能语言。它有可变的数据结构。下面的事情可被分配给:

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

在这些情况下的可变的多个领域,<-语法用于分配。

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

相关问题