2012-10-14 45 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合作。

相關問題