scala – 正确使用可变/不可变列表
发布时间:2020-12-16 09:32:18 所属栏目:安全 来源:网络整理
导读:目前,我试图了解Scala中的功能编程,我遇到了一个我无法想象的问题。 想像下面的情况: 你有两个类:Controller和Bot。一个Bot是一个独立的Actor,由控制器启动,执行一些昂贵的操作并将结果返回给Controller。因此,控制器的目的很容易描述:实例化Bot的多
目前,我试图了解Scala中的功能编程,我遇到了一个我无法想象的问题。
想像下面的情况: 你有两个类:Controller和Bot。一个Bot是一个独立的Actor,由控制器启动,执行一些昂贵的操作并将结果返回给Controller。因此,控制器的目的很容易描述:实例化Bot的多个对象,启动它们并接收结果。 到现在为止还挺好;我可以实现所有这一切,而不使用任何可变对象。 但是,如果我必须存储一个Bot返回的结果,然后再使用它作为另一个Bot的输入(后来意味着我不知道什么时候在编译时),我该怎么办? 使用可变列表或集合进行此操作相当容易,但是我在代码中添加了很多问题(因为我们在此处处理并发问题)。 遵循FP范式,可以通过使用不可变对象(列表…)来安全解决这个问题吗? BTW,新的FP,所以这个问题可能听起来很愚蠢,但我不知道如何解决这个:) 解决方法
这是一个像Erlang的演员如何看Scala:
case class Actor[State](val s: State)(body: State => Option[State]) { // immutable @tailrec def loop(s1: State) { body(s1) match { case Some(s2) => loop(s2) case None => () } } def act = loop(s) } def Bot(controller: Actor) = Actor(controller) { s => val res = // do the calculations controller ! (this,res) None // finish work } val Controller = Actor(Map[Bot,ResultType]()) {s => // start bots,perhaps using results already stored in s if ( // time to stop,e.g. all bots already finished ) None else receive { case (bot,res) => Some(s + (bot -> res)) // a bot has reported result } } Controller.act (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – 在ui-router中的$transition.onBefore中重定向
- Angular2 – 单元测试Observable错误“无法读取未定义的属性
- bootstrap table分页采用server方式,分页查询
- 从Angular 2服务创建和返回Observable
- 浅谈如何让 Bootstrap 3兼容IE8浏览器
- Scala中的参数化数据类型
- Angularjs Promise.all没有更新范围,而$q.all确实如此
- 处理twitter chill中的案例类(Scala接口到Kryo)?
- angular-cli 暂停时出现端口占用的问题[已解决]
- 如果scala主张不变性为什么它采用具有可变性质的演员模型?