Я изучаю преобразователи монад в Scala, но столкнулся с проблемой, которую пока не могу решить. В моем стеке преобразователя монад я составляю монаду Either и State. Однако мне не удается вызвать функции, принадлежащие одной из двух монад:
import scalaz._
import Scalaz._
object Minimal {
type Inner[A] = EitherT[Id, String, A]
type Outer[F[+_], A] = StateT[F,Int,A]
type Stack[A] = Outer[Inner, A]
def foo:Stack[Int] = for {
n <- get[Int]
} yield {
2 * n
}
def main(args: Array[String]): Unit = {
val x = foo.eval(8)
println(x)
}
}
Сбой со следующим сообщением об ошибке:
[error] Minimal.scala:10: type mismatch;
[error] found : scalaz.IndexedStateT[scalaz.Id.Id,Int,Int,Int]
[error] required: Minimal.Stack[Int]
[error] (which expands to) scalaz.IndexedStateT[Minimal.Inner,Int,Int,Int]
[error] n <- get[Int]
Если я изменю стек преобразователя монад на:
type Stack[A] = State[Int,A]
Программа компилируется и запускается без проблем. Кто-нибудь знает, что я здесь делаю не так?