首页 > 解决方案 > Scala,猫 - 如何不明确使用 Applicative[F]?

问题描述

我想以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是很好的做法。你能帮我解决这个问题吗?

标签: scalascala-catsapplicative

解决方案


首先,为什么你认为这是一个不好的做法。这是一种常见的Applicative语法。如果你想要一些“魔法”自动提升你的价值BetApplicative[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])由 simulacrum 自动生成的@typeclass


推荐阅读