тип обработки безопасного состояния в функциях - PullRequest
1 голос
/ 02 февраля 2011

Итак, я хочу иметь набор функций, которые получают состояние и возвращают результат с новым состоянием. По сути, государственная монада, но без монадических методов. В отличие от монады состояний, состояние не должно передаваться между функциями, скорее вызывается функция, которая возвращает результат и состояние, и состояние сохраняется до следующего вызова функции. Итак, у меня есть Список функций и список состояний (каждая функция имеет свой тип состояния), и я хочу вызвать каждую функцию с ее состоянием и обновить список состояний.

Моя проблема в том, что я не могу заставить это работать без кастинга.

Вот сессия 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)
              ^

1 Ответ

0 голосов
/ 03 февраля 2011

Таким образом, решение, которое я нашел, состоит в том, чтобы использовать класс, который оборачивает два:

scala> case class StateWithVal[T](f: StateM[T], v: T) {def apply() = StateWithVal(f, f(v)._2)}
defined class StateWithVal

scala> val sv:StateWithVal[_] = StateWithVal(c, 0)
sv: StateWithVal[_] = StateWithVal(<function1>,0)

scala> sv()
res15: StateWithVal[_] = StateWithVal(<function1>,1)
...