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]
,那么您将需要某种隐式转换,这将是 非常糟糕的做法 。
你看看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
.
自动生成
我想以其他方式明确使用 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]
,那么您将需要某种隐式转换,这将是 非常糟糕的做法 。
你看看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])
召唤的,它由 simulacrum 的 @typeclass
.