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

Scala, cats - how to do not use Applicative[F] explicity?

我想以其他方式明确使用 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 显式 return 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 这样的显式调用方法是很好的做法。你能帮我吗?

首先,您为什么认为这是一种不好的做法。这是一个常见的 Applicative 语法。如果您希望某些 "magic" 自动将您的值 Bet 提升为 Applicative[Bet],那么您将需要某种隐式转换,这将是 非常糟糕的做法

你看看Applicativehttps://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]) 召唤的,它由 simulacrum 的 @typeclass.

自动生成