Я немного знаком с преобразователями монад Haskell, но новичок в Scalaz (версия 7). Я сделал (как мне показалось) простой перевод следующего кода на Haskell:
import Control.Monad.State
type Pass a = StateT String Maybe a
monadTest :: Pass String
monadTest = do
s <- get
return s
к этому коду Scala:
import scalaz._
import Scalaz._
object StateTest {
type Pass[A] = StateT[Option, String, A]
def monadTest: Pass[String] =
for {
s <- get[String]
} yield s
}
Код Haskell компилируется. Scala не компилируется со следующей ошибкой:
[error] .../StateTest.scala:9: type mismatch;
[error] found : scalaz.IndexedStateT[scalaz.Id.Id,String,String,String]
[error] required: StateTest.Pass[String]
[error] (which expands to) scalaz.IndexedStateT[Option,String,String,String]
[error] s <- get[String]
[error] ^
Во-первых, кажется, что scalaz реализует StateT
с точки зрения IndexedStateT
. В порядке. Но похоже, что монадическое значение get[String]
имеет тип StateT[Id, String, String]
вместо StateT[Option, String, String]
. Почему?
Я использую Scala 2.10.1, scalaz 7.0.0.