1

我正在尝试在 opa 中实现回调,因此当变量在服务器端更新时,客户端会立即获得更新后的值。

我知道我可以通过网络做到这一点:

Network.add_callback(update_function, room)

但是,作为一项学习练习,我想自己实现该功能。

我的第一个想法是创建一个void->void函数列表list(void->void),这是我遇到的第一个问题,即缺少可变状态和变量。所以我不能将任何回调函数添加到创建的列表中。

这引出了我的第一个问题:我如何在没有可变状态的情况下工作?我不认为自己是函数式编程的新手,但通常我只会重新分配一个变量

IE

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

这引出了我的第二个问题:

有没有比 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 上看到的那样具有可变性。但是正如您所知,可变值不是线程安全的,即您可以被抢占 beetwen get 和 set,这意味着您的状态不一致。

因此,要解决此问题,您可以使用Session。基本上,会话是一个状态和一个消息处理程序。会话处理程序被线程安全地执行以更新会话状态。会话的另一个优点是可以由任何系统实体无缝地序列化和操作。

你的例子可以写成:

// 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 回答