Tôi có một cấu trúc dữ liệu không thay đổi nơi tôi đã lồng giá trị trong Maps, như vậy:Tránh lặp lại sử dụng ống kính trong khi sâu sao chép vào Bản đồ giá trị
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)
riêng tôi có một danh sách của tất cả các ngành nghề trong ngày, và tôi muốn tạo ra cấu trúc TradingDay
, nơi
case class Trade(sym: String, trader: String, qty: Int)
tôi đang cố gắng tìm ra làm thế nào tôi sẽ cập nhật cấu trúc này với ống kính (xem phụ lục) bằng cách gấp qua các giao dịch của tôi:
(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
}
này hoạt động; nhưng tôi tự hỏi liệu tôi có thể ít lặp đi lặp lại (về thêm vào bản đồ và sau đó thay đổi giá trị tại các trọng điểm của bản đồ. Nó dường như không phải là ít nhiều gây phiền nhiễu hơn so với sâu bản liên quan.
Phụ lục - các ống kính
object TradingDay {
val Syms = Lens[TradingDay, Map[String, SymDay]](_.syms, (d, s) => d.copy(syms = s))
}
object SymDay {
val Traders = Lens[SymDay, Map[String, TraderSymDay]](_.traders, (d, t) => d.copy(traders = t))
}
object TraderSymDay {
val Trades = Lens[TraderSymDay, List[Trade]](_.trades, (d, f) => d.copy(trades = f))
}
+1 cho một câu hỏi với một phụ lục – ziggystar