gpt4 book ai didi

Scala:使用 StateT monad 转换器组成的 Option 的错误推断类型

转载 作者:行者123 更新时间:2023-12-04 17:50:59 25 4
gpt4 key购买 nike

我对 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 似乎实现了 StateT根据 IndexedStateT .行。但是,似乎 get[String] monadic 值被推断为类型 StateT[Id, String, String]而不是 StateT[Option, String, String] .为什么?

我正在使用 Scala 2.10.1、scalaz 7.0.0。

最佳答案

在您的示例中,调用 get[String]正在调用get StateFunctions的方法,转载在这里:

def get[S]: State[S, S] = init

在哪里 State[S, A]StateT[Id, S, A] 的别名这是 IndexedStateT[Id, S, S, A] 的别名.

因为您使用的是 StateT ,您需要调用 getStateTMonadState[S, F] 的实例上, 或 StateTMonadState[String, Option]在你的情况下。工作示例是:
import scalaz._
import Scalaz._

object StateTest {
type Pass[A] = StateT[Option, String, 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。

关于Scala:使用 StateT monad 转换器组成的 Option 的错误推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16268783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com