Я использую 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)
}