我想用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
这样的显式调用方法。你能帮我吗?
答案 0 :(得分:4)
首先,您为什么认为这是一个不好的做法。这是常见的Applicative
语法。如果您想让“魔术师”自动将您的值Bet
提升为Applicative[Bet]
,则需要某种隐式转换,这是极不正确的做法。
您来看看Applicative
https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/Applicative.scala
Applicative[Option].pure(10)
这里Applicative[Option]
实例是由apply[F[_]](implicit instance: Applicative[F])
召唤的,@typeclass
是由Simulacrum的{{1}}自动生成的。