加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读