関数の入力に基づいて変化するベクトルを定義し、設定する関数を作成しようとしています! これはSchemeでうまく機能します。OCamlにこれと同等の機能がありますか?
2 に答える
質問を拡大し、より詳細な例を示す必要があるという 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 への 2 つの呼び出し間でいくつかの情報を共有する必要があります。解決策は、可変ストレージを使用し、いわゆる副作用によってストアと対話することです。
OCaml では、カウンターは次のように定義できます。
let new_count =
let r = ref 0 in
let next () = r := !r+1; !r in
next;;
もう 1 つの、おそらくより具体的なミュータブル ストレージの例は、銀行口座です。OCaml では、レコード フィールドをミュータブルと宣言できるため、後で新しい値を割り当てることができます。したがって、銀行口座は、その番号と残高の 2 つのフィールド レコードであり、残高は変更可能です。
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
set!
スキームでは、変数に代入します。OCaml では、変数に代入することはまったくできません。(つまり、「変数」は実際には「変数」ではありません。)したがって、同等のものはありません。
しかし、OCaml は純粋な関数型言語ではありません。変更可能なデータ構造を持っています。次のものを割り当てることができます。
- 配列要素
- 文字列要素
- レコードの可変フィールド
- オブジェクトの可変フィールド
このような状況では、<-
構文が代入に使用されます。
ref
@jrouquie が言及した型は、1 つの可変コンテナーとして機能する単純な組み込み型の可変レコード型です。OCaml はs を操作するための!
and:=
演算子も提供しますref
。