scala – 避免重复使用镜头,同时深入复制到Map值
发布时间:2020-12-16 09:18:31 所属栏目:安全 来源:网络整理
导读:我有一个不可变的数据结构,我在地图中嵌套了值,如下所示: case class TradingDay(syms: Map[String,SymDay] = Map.empty)case class SymDay(sym: String,traders: Map[String,TraderSymDay] = Map.empty)case class TraderSymDay(trader: String,sym: Strin
我有一个不可变的数据结构,我在地图中嵌套了值,如下所示:
case class TradingDay(syms: Map[String,SymDay] = Map.empty) case class SymDay(sym: String,traders: Map[String,TraderSymDay] = Map.empty) case class TraderSymDay(trader: String,sym: String,trades: List[Trade] = Nil) 我单独列出了一天中的所有交易,我想在其中生成TradingDay结构 case class Trade(sym: String,trader: String,qty: Int) 我想知道如何通过折叠我的交易来更新这个结构与镜头(见附录): (TradingDay() /: trades) { (trd,d) => def sym = trd.sym def trader = trd.trader import TradingDay._ import SymDay._ import TraderSymDay._ val mod = for { _ <- (Syms member sym).mods( _ orElse some(SymDay(sym))) _ <- (Syms at sym andThen Traders member trader).mods( _ orElse some(TraderSymDay(trader,sym))) _ <- (Syms at sym andThen (Traders at trader) andThen Trades).mods( trd :: _) x <- init } yield x mod ! d } 这样做但我想知道我是否可以减少重复(在添加地图,然后修改地图的关键值的值方面,似乎并不比相关的深层拷贝更为烦人. 附录 – 镜头 object TradingDay { val Syms = Lens[TradingDay,Map[String,SymDay]](_.syms,(d,s) => d.copy(syms = s)) } object SymDay { val Traders = Lens[SymDay,TraderSymDay]](_.traders,t) => d.copy(traders = t)) } object TraderSymDay { val Trades = Lens[TraderSymDay,List[Trade]](_.trades,f) => d.copy(trades = f)) } 解决方法
同
type @>[A,B] = Lens[A,B] 并保持这个镜头 val Syms : Lens[TradingDay,SymDay]] 并定义这些镜头: val F : Map[String,SymDay] @> Option[SymDay] = ... val G : Option[SymDay] @> Map[String,TraderSymDay] = ... val H : Map[String,TraderSymDay] @> Option[TraderSymDay] = ... val I : Option[TraderSymDay] @> List[Trade] = ... val J: TradingDay @> List[Trade] = Syms >=> F >=> G >=> H >=> I 你可以得到这个: (trades /: TradingDay()){ (trd,d) => (J.map(trd :: _).flatMap(_ => init)) ! d } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angular中的ng-repeat-start和ng-repeat-end的用法介绍
- vim – 使用ssh / Putty和netrw在Windows上透明地编辑远程文
- 如何对BASH中的字符串中的每个字符执行一个for循环?
- 斯卡拉的私人领域制定者
- 在shell脚本中处理算术表达式
- setCenter无法在angular2-google-maps中工作
- 完成命令时bash可以省略备份文件吗?
- WCF4.0 –- RESTful WCF Services (4) (Basic Security)
- angular – 动态更改img [src]
- 使用AngularJS将新行添加到ng-grid表的最简单方法是什么?