Я написал один пример использования scalaz.Free, чтобы сопоставить действие с будущим, это выглядит довольно круто. Тем не менее, я пытаюсь понять преимущества этого. Я надеюсь, что смогу получить ответ здесь. Вот мой фрагмент кода
Во-первых, я создаю действие, которое является AST.
trait Action[A]
case class GetNumberAction(x: Int) extends Action[Int]
case class GetStringAction(x: String) extends Action[String]
case class ConvertToIntAction(x: String) extends Action[Int]
case class AddAction(x: Int, y: Int) extends Action[Int]
Затем я создаю класс для сопоставления Action с ASTMonad, используя Scalaz Free и Coyonda.
type Functor[A] = Coyoneda[Action, A]
type ASTMonad[A]= Free[Functor, A]
def toMonad[A](action: Action[A]): ASTMonad[A] = Free.liftFC[Action, A](action)
object ADTMonad {
def getNumber(x: Int): ASTMonad[Int] = toMonad(GetNumberAction(x))
def getString(x: String): ASTMonad[String] = toMonad(GetStringAction(x))
def converToInt(x: String): ASTMonad[Int] = toMonad(ConvertToIntAction(x))
def add(x: Int, y: Int): ASTMonad[Int] = toMonad(AddAction(x, y))
}
Наконец, я создаю интерпретатор для интерпретации Action to Future.
object Interpreter extends (Action ~> Future) {
def apply[A](action: Action[A]): Future[A] = {
action match {
case GetNumberAction(x) => Future(x)
case GetStringAction(x) => Future(x)
case ConvertToIntAction(x) => Future(x.toInt)
case AddAction(x, y) => Future(x + y)
}
}
}
Когда я запускаю его, я могу использовать
val chain = for {
number <- ASTMonad.getNumber(x)
str <- ASTMonad.getString(y)
convertedNumber <- ASTMonad.converToInt(str)
total <- ASTMonad.add(number, convertedNumber)
} yield total
chain.runWith(Interpreter)
Кажется, это работает, и я думаю, что понимаю эту монаду и интерпретатор. Однако я думаю, каковы преимущества по сравнению с решением, если я использую Future.flatmap и map напрямую?
for {
number <- Future(x)
str <- Future(y)
convertedNumber <- Future(str.toInt)
total <- Future(number + convertedNumber)
} yield total
Код использования Future flatmap и map мне кажется проще. Итак, вернемся к моим вопросам: нужно ли нам использовать монаду Free для интерпретации бизнес-логики в Future, поскольку Future уже предоставила flatMap и карту. Если это так, может ли кто-нибудь привести мне более конкретный пример, чтобы я мог увидеть преимущества?
заранее спасибо