加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:49:09 所属栏目:安全 来源:网络整理
导读:我对 Haskell monad变换器有点熟悉,但对 Scalaz(版本7)不熟悉.我从以下Haskell代码中做了(我认为是)一个简单的翻译: import Control.Monad.Statetype Pass a = StateT String Maybe amonadTest :: Pass StringmonadTest = do s - get return s 这个Scala代
我对 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读