Scala,猫-如何不明确使用Applicative [F]?

时间:2019-04-20 17:53:43

标签: scala scala-cats applicative

我想用Applicative[F]以外的其他方式使用。目前,我有一个简单的代码:

class BettingServiceMock[F[_] : Async] extends BettingService[F] {    
      override def put(bet: Bet): F[Bet] = {
        for {
          created <- Bet(Some(BetId(randomUUID().toString)), bet.stake, bet.name).pure
        } yield created
      }
    }

Bet只是一个简单的case class。我显式使用方法pure返回F[Bet]。是否有某种方法可以像这样(不要显式调用pure方法)? 我试图做这样的事情:

class BettingServiceMock[F[_] : Async] (implicit a:Applicative[F]) extends BettingService[F] {

  override def put(bet: Bet): F[Bet] = {
    for {
      created <- Bet(Some(BetId(randomUUID().toString)), bet.stake, bet.name)
    } yield created
  }
}

它没有帮助,因为出现错误: value map is not a member of model.Bet <- (Some(BetId(randomUUID().toString)), bet.stake, bet.name)

我想在Cats中发现一些好的做法,这就是我要问的方式。我不认为这样的做法是pure这样的显式调用方法。你能帮我吗?

1 个答案:

答案 0 :(得分:4)

首先,您为什么认为这是一个不好的做法。这是常见的Applicative语法。如果您想让“魔术师”自动将您的值Bet提升为Applicative[Bet],则需要某种隐式转换,这是极不正确的做法

您来看看Applicative https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/Applicative.scala

的scaladoc示例
Applicative[Option].pure(10)

这里Applicative[Option]实例是由apply[F[_]](implicit instance: Applicative[F])召唤的,@typeclass是由Simulacrum的{{1}}自动生成的。