0

関数の入力に基づいて変化するベクトルを定義し、設定する関数を作成しようとしています! これはSchemeでうまく機能します。OCamlにこれと同等の機能がありますか?

4

2 に答える 2

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をインクリメントして新しい値を返す単一の関数をインターフェイスとするカウンターの実装が妨げられます。この関数を繰り返し呼び出すと、連続する整数のシーケンスが返されます。毎回異なる答えが返されます。

実際、カウンタは読み取り/書き込みアクセスを使用して、特定の場所でその状態を記憶する必要がありますが、何よりもまず、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
于 2012-10-14T16:51:56.887 に答える
0

set!スキームでは、変数に代入します。OCaml では、変数に代入することはまったくできません。(つまり、「変数」は実際には「変数」ではありません。)したがって、同等のものはありません。

しかし、OCaml は純粋な関数型言語ではありません。変更可能なデータ構造を持っています。次のものを割り当てることができます。

  • 配列要素
  • 文字列要素
  • レコードの可変フィールド
  • オブジェクトの可変フィールド

このような状況では、<-構文が代入に使用されます。

ref@jrouquie が言及した型は、1 つの可変コンテナーとして機能する単純な組み込み型の可変レコード型です。OCaml はs を操作するための!and:=演算子も提供しますref

于 2012-10-15T18:29:51.223 に答える