1

opa にコールバックを実装しようとしているので、変数がサーバー側で更新されると、クライアントはその更新された値をすぐに取得します。

私はネットワークでそれを行うことができることを知っています:

Network.add_callback(update_function, room)

ただし、学習演習として、その機能を自分で実装したいと考えています。

void->void最初に考えたのは、関数のリストを作成することでしたlist(void->void)。ここで、変更可能な状態と変数がないという最初の問題に遭遇しました。そのため、作成したリストにコールバック関数を追加できません。

これは私の最初の質問につながります: 変更可能な状態を持たずに作業するにはどうすればよいですか? 関数型プログラミングは初めてだとは思いませんが、通常は変数を再割り当てするだけです

すなわち

x = ['a','b','c']
function addVal(val){
    x = List.add(val,x)
}

しかし、これは opa では合法ではないようです。

変数や変更可能なデータ構造なしで作業するにはどうすればよいでしょうか? 可変状態なしで動的コンテンツを実装する方法がわかりません。

この問題を回避するために、コールバック関数のリストをデータベースに保存することにしました。

database callbacks{
  list(void -> void) functions
}

しかし、私はエラーが発生します

Elements of type void -> void cannot be stored in the database

これは私の2番目の質問に私を導きます:

doc.opalang.org よりも優れた opa のリソースはありますか? データベースで許可されている型に関する情報を見つけることができませんでした。

要約すると:

  1. 変更可能な状態や変数を使用せずに実際に何かを行うプログラムを作成するにはどうすればよいですか?
  2. opa データベースで許可されているタイプは何ですか?
  3. doc.opalang.org 以外に opa に関する有用なリソースはありますか?
4

2 に答える 2

3

そして、クエンティンの回答に例を追加するには:

于 2012-07-25T08:37:27.487 に答える
2

1) Opa は関数型言語であるため、最初の例は Opa では正しくありません。

x = ['a', 'b', 'c']

変数 x を宣言しませんが、identxと value の間のバインディングを宣言します['a', 'b', 'c']

Opa が関数型言語であっても、 OpaDoc で見られるように変更可能です。しかし、ご存知のように、変更可能な値はスレッドセーフではありません。つまり、get と set の間でプリエンプトされる可能性があるため、sate に一貫性がないことを意味します。

したがって、この問題を解決するには、Sessionを使用できます。基本的に、セッションは状態とメッセージ ハンドラーです。セッションハンドラーは、セッション状態を更新するためにスレッドセーフに実行されます。もう 1 つの利点は、セッションをシリアル化して、任意のシステム エンティティからシームレスに操作できることです。

あなたの例は書くことができます:

// A channel which can receive add message 
channel({string add}) s = Session.make(['a', 'b', 'c'], 
      function(oldstate, message){
        match(message){
          case {add : value} : {set : List.add(value, oldstate)} //setting the new state
          .... // other message
        }
      }
    )

function addVal(value){
  Session.send(s, {add : value}
}

2) データベースには純粋なデータ構造のみを格納できます。

于 2012-07-25T08:29:27.707 に答える