Tôi đang bao quanh đầu của mình xung quanh đơn vị tiểu bang. Các ví dụ tầm thường dễ hiểu. Bây giờ tôi đang chuyển sang một trường hợp thế giới thực, nơi các đối tượng miền được tổng hợp. Ví dụ, với các đối tượng miền sau (họ không có ý nghĩa nhiều, chỉ cần tuyệt ví dụ):Đơn vị tiểu bang Scala - kết hợp các loại trạng thái khác nhau
case class Master(workers: Map[String, Worker])
case class Worker(elapsed: Long, result: Vector[String])
case class Message(workerId: String, work: String, elapsed: Long)
Xét Worker
như S
loại trong State[S, +A]
đơn nguyên nó khá dễ dàng để viết một vài combinators như thế này:
type WorkerState[+A] = State[Worker, A]
def update(message: Message): WorkerState[Unit] = State.modify { w =>
w.copy(elapsed = w.elapsed + message.elapsed,
result = w.result :+ message.work)
}
def getWork: WorkerState[Vector[String]] = State { w => (w.result, w) }
def getElapsed: WorkerState[Long] = State { w => (w.elapsed, w) }
def updateAndGetElapsed(message: Message): WorkerState[Long] = for {
_ <- update(message)
elapsed <- getElapsed
} yield elapsed
// etc.
Cách thành ngữ để kết hợp chúng với bộ kết hợp trạng thái Master
là gì? ví dụ.
type MasterState[+A] = State[Master, A]
def updateAndGetElapsedTime(message: Message): MasterState[Option[Long]]
tôi có thể thực hiện điều này như sau:
def updateAndGetElapsedTime(message: Message): MasterState[Option[Long]] =
State { m =>
m.workers.get(message.workerId) match {
case None => (None, m)
case Some(w) =>
val (t, newW) = updateAndGetElapsed(message).run(w)
(Some(t), m.copy(m.workers.updated(message.workerId, newW))
}
}
Những gì tôi không thích là tôi phải tự chạy đơn nguyên nhà nước bên trong máy biến áp ngoái. Ví dụ thế giới thực của tôi có liên quan nhiều hơn một chút. Với cách tiếp cận này, nó nhanh chóng bị lộn xộn.
Có cách nào thành ngữ hơn để chạy loại cập nhật gia tăng này không?
Câu hỏi hay! Bạn đang đề cập đến một số thực hiện cụ thể 'State' như' scalaz'? – Odomontois
Nó chắc chắn trông giống như ví dụ tốt đẹp cho sử dụng 'LensT', không thể chờ đợi để xem một số câu trả lời của chuyên gia. – Odomontois