Scala:使用StateT monad转换器组成的选项的错误推断类型
我对
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] [error] required: StateTest.Pass[String] [error] (which expands to) scalaz.IndexedStateT[Option,String] [error] s <- get[String] [error] ^ 首先,似乎scalaz在IndexedStateT方面实现了StateT.好.但是,似乎get [String] monadic值被推断为具有类型StateT [Id,String]而不是StateT [Option,String].为什么? 我正在使用Scala 2.10.1,scalaz 7.0.0. 解决方法
在您的示例中,对[String]的调用是调用StateFunctions的get方法,在此处再现:
def get[S]: State[S,S] = init 其中State [S,A]是StateT [Id,S,A]的别名,它是IndexedStateT [Id,A]的别名. 因为您正在使用StateT,所以需要在您的情况下调用StateTMonadState [S,F]或StateTMonadState [String,Option]的实例上的get.工作示例是: import scalaz._ import Scalaz._ object StateTest { type Pass[A] = StateT[Option,A] val sm = StateT.stateTMonadState[String,Option] def monadTest: Pass[String] = for { s <- sm.get } yield s } MonadState实例也可以通过MonadState [F [_,_],S]隐式解析,但由于需要lambda类型,因此使用起来不太方便.有关详细信息,请参阅MonadState.scala和StateT.scala. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |