Как исправить состояние моноида типа в следующем коде - PullRequest
1 голос
/ 07 июля 2019

Я использую State monoid для обновления состояния объекта, как указано в книге «Функциональное и реактивное моделирование домена» во время работы CQRS. Как я понимаю, если вы не хотите возвращать какое-либо значение, вы можете просто использовать (), как показано ниже. Но от меня я продолжаю получать «Выражение типа Unit не соответствует ожидаемому типу A». Эти строки ниже
State {s => (updateState (r, s), ())} выдает мне эту ошибку. Насколько я понимаю, этот код работал раньше, когда книга была опубликована, я думаю, из-за недавних изменений в Scalaz она теперь не работает. Я только начал смотреть на Скалаз пару дней назад и задавался вопросом, могут ли какие-нибудь эксперты Скалаза вмешаться.

Я уже пытался перевести State [Map [String, Account], A] в State [Map [String, Account], Unit], но это нарушает exec.

object PureInterpreter {
  import Event._
  import Commands.Command
  type MapState[A] = State[Map[String, Account], A]

  val step = new (Event ~> MapState) {
    override def apply[A](fa: Event[A]): MapState[A] = fa match {
      case o @ Opened(no, _, _) =>
        State { s => (updateState(o, s), no) }

      case c @ Closed(_, _) =>
        State { s => (updateState(c, s), ()) }

      case d @ Debited(_, _) =>
        State { s => (updateState(d, s), ()) }

      case r @ Credited(_, _) =>
        State { s => (updateState(r, s), ()) }
    }
  }

  def interpret[A](c: Command[A], state: Map[String, Account] = Map.empty): Map[Strin  g, Account] =
    c.foldMap(step).exec(state)

}
...