Возможно ли, чтобы частично примененная функция вызывала свое частично примененное Я? - PullRequest
0 голосов
/ 09 марта 2020

Я начал играть с Аккой и обнаружил, что большинство моих актеров имеют частично неизменяемое состояние и частично изменяемое состояние. Оба могут быть объединены в State класс case, который затем можно скопировать только в его изменяемое состояние и передать обратно в apply для обновления Behavior.

Однако было бы волшебно, если бы в этом не было необходимости. Возможно ли для частично примененной функции Scala как-то рекурсивно вызывать себя, но начиная с ее второго списка параметров? Вместо того, чтобы начинать всю цепочку с самого начала?

sealed trait Command
final case class AddA() extends Command
final case class AddB() extends Command

def apply(
  immutableState1: String,
  immutableState2: String,
  immutableState3: String
)(
  mutableState: List[String] = Nil
): Behavior[Command] = Behaviors.receiveMessage {

  // without respecifying all immutable state:
  case AddA() => CallIts2ndParamList("A" :: mutableState)

  // what I'm trying to avoid:
  case AddB() => apply(
    immutableState1,
    immutableState2,
    immutableState3
  )("B" :: mutableState)
}

1 Ответ

0 голосов
/ 09 марта 2020

Ах, может быть, я искал решения не в той области. Вложенная функция должна делать свое дело на самом деле!

  sealed trait Command
  final case class AddA() extends Command
  final case class AddB() extends Command

  def apply(
      immutableState1: String,
      immutableState2: String,
      immutableState3: String
  ): Behavior[Command] = {
    def nestedApply(mutableState: List[String]): Behavior[Command] =
      Behaviors.receiveMessage {
        case AddA() => nestedApply("A" :: mutableState)
      }
    nestedApply(Nil)
  }
...