从较低级别的

时间:2015-08-28 10:42:08

标签: scala scalaz scalaz7

我对scalaz很陌生,我正试图将各种类型转换为monad变换器。

我一直试图将Int转换为OptionT[Future, Int],甚至转换为EitherT[Future, String, Int]

我发现了一堆教程/ SO答案,解释了如何使用point执行此操作,但出于某种原因我无法编译它们。

例如,来自here的此代码段:

1.point[({ type L[x] = EitherT[Future, String, x] })#L]
  

错误:(9,9)找不到类型scalaz.Applicative[[x]scalaz.EitherT[scala.concurrent.Future,String,x]]

的证据参数的隐含值

另一个来自Scalaz Monad Transformers

type Result[A] = OptionT[Future, A]
"".point[Result]
  

错误:(8,10)找不到类型scalaz.Applicative[A$A35.this.Result]

的证据参数的隐含值

我相信这个应该也可以,但它说方法liftM不是Future[Int]的成员:

1.point[Future].liftM[OptionT]    //doesnt compile
1.point[List].liftM[OptionT]      //compiles

所有这些示例都失败了,但如果我用Future代替List,它们就会编译。现在,这是对我有用的唯一方法,但它有点冗长 - 我真的希望能够使用point代替:

OptionT(Future.successful(1.some))

为什么不编译?在最近的版本中,Future的应用/ monad是否已从scalaz中删除了?

我正在使用scala 2.11.7和scalaz 7.1.3。对于它的价值,这些是我的进口:

import scala.concurrent.Future
import scalaz._
import Scalaz._

1 个答案:

答案 0 :(得分:7)

导入ExecutionContext会使您的解决方案得到编译,请参阅scalaz.std.scalaFuture

import scala.concurrent.ExecutionContext.Implicits.global

type Result[A] = OptionT[Future, A]
"".point[Result]
// Result[String] = OptionT(scala.concurrent.impl.Promise$DefaultPromise@5e155fc)

1.point[Future].liftM[OptionT]
// scalaz.OptionT[scala.concurrent.Future,Int] = OptionT(scala.concurrent.impl.Promise$DefaultPromise@60821af9)