Итак, я хочу иметь набор функций, которые получают состояние и возвращают результат с новым состоянием. По сути, государственная монада, но без монадических методов. В отличие от монады состояний, состояние не должно передаваться между функциями, скорее вызывается функция, которая возвращает результат и состояние, и состояние сохраняется до следующего вызова функции. Итак, у меня есть Список функций и список состояний (каждая функция имеет свой тип состояния), и я хочу вызвать каждую функцию с ее состоянием и обновить список состояний.
Моя проблема в том, что я не могу заставить это работать без кастинга.
Вот сессия REPL:
scala> type StateM[T] = T => (Int, T)
defined type alias StateM
scala> val c: StateM[Int] = {i => (i, i + 1)}
c: (Int) => (Int, Int) = <function1>
scala> val a: StateM[_] = c
a: StateM[_] = <function1>
scala> val z: Any = 0
z: Any = 0
scala> a(z)
<console>:19: error: type mismatch;
found : z.type (with underlying type Any)
required: _$1 where type _$1
a(z)
^
ОБНОВЛЕНИЕ: Я думал, что, возможно, помогут экзистенциальные типы. Что-то вроде:
scala> type StateT = Pair[StateM[X], X] forSome {type X}
defined type alias StateT
scala> val t: StateT = (c, 0)
t: StateT = (<function1>,0)
scala> t._1(t._2)
<console>:13: error: type mismatch;
found : t._2.type (with underlying type Any)
required: X where type X
t._1(t._2)
^