【发布时间】:2013-04-28 22:39:13
【问题描述】:
我对 Haskell monad 转换器有点熟悉,但对 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 似乎在IndexedStateT 方面实现了StateT。行。但是,似乎get[String] monadic 值被推断为具有StateT[Id, String, String] 类型而不是StateT[Option, String, String]。为什么?
我正在使用 Scala 2.10.1、scalaz 7.0.0。
【问题讨论】:
标签: scala haskell monads scalaz monad-transformers