我正在尝试在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
这引出了我的第二个问题:
是否有比doc.opalang.org更好的opa资源?我无法找到有关数据库中允许的类型的任何信息。
总结如下:
答案 0 :(得分:3)
并为Quentin回答:
添加示例答案 1 :(得分:2)
1)Opa是一种函数式语言, 因此,确实第一个例子在Opa中是不合法的。
x = ['a', 'b', 'c']
不声明变量x,而是声明x
和值['a', 'b', 'c']
之间的绑定。
即使Opa是一种功能语言,你也有可变的as you see on the 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)您只能在数据库中存储纯粹的数据结构。