У меня есть окончательный DSL без тегов для построения простых математических выражений:
trait Entity[F[_]] {
def empty: F[Int]
def int(value: Int): F[Int]
}
trait Operation[F[_]] {
def add(a: F[Int], b: F[Int]): F[Int]
}
Я хотел реализовать интерпретатор ZIO. На основе module-pattern
руководства возможная реализация может выглядеть следующим образом:
type Entity = Has[Entity[UIO]]
object Entity {
val test: ULayer[Entity] =
ZLayer.succeed {
new Entity[UIO] {
override def empty: UIO[Int] =
ZIO.succeed(0)
override def int(value: Int): UIO[Int] =
ZIO.succeed(value)
}
}
def empty: URIO[Entity, Int] =
ZIO.accessM(_.get.empty)
def int(value: Int): URIO[Entity, Int] =
ZIO.accessM(_.get.int(value))
}
type Operation = Has[Operation[UIO]]
object Operation {
val test: ULayer[Operation] =
ZLayer.succeed {
new Operation[UIO] {
override def add(a: UIO[Int], b: UIO[Int]): UIO[Int] =
ZIO.tupled(a, b).map { case (x, y) => x + y }
}
}
def add(a: UIO[Int], b: UIO[Int]): URIO[Operation, Int] =
ZIO.accessM(_.get.add(a, b))
}
При построении выражений с этой реализацией необходимо неоднократно вызывать provideLayer
следующим образом:
Operation.subtract(
Entity.empty.provideLayer(Entity.test),
Entity.int(10).provideLayer(Entity.test)
).provideLayer(Operation.test)
Это больше похоже на антипаттерн. Какой способ интерпретации DSL был бы самым идиоматичным или самым ZIO?
def add(a: UIO[Int], b: UIO[Int]): UIO[Int]
немного странно. Почему неadd(a: Int, b: Int): UIO[Int])
? - person Thilo   schedule 08.12.2020add(a: Term[Int], b: Term[Int]): Term[Int]
для какого-тоTerm
для кодирования ваших математических выражений? При чем здесь ZIO?ZIO
описывает эффекты (которые затем можно запускать и сочинять, но больше не нужно заглядывать внутрь, чтобы понять, что они делают). - person Thilo   schedule 08.12.2020Service
определены где-то еще, и для их реализации я использую только ZIO. В том смысле, что их нельзя изменить. Для уточнения у них подписьdef int(value: Int): F[Int]
иdef add(a: F[Int], b: F[Int]): F[Int]
- person Lando-L   schedule 08.12.2020