scala - 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
是很好的做法。你能帮我解决这个问题吗?
解决方案
首先,为什么你认为这是一个不好的做法。这是一种常见的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])
由 simulacrum 自动生成的@typeclass
。
推荐阅读
- azure-devops - 如何识别 AzureDevops 中附加有变量组的管道列表
- python - BayesSearchCV 超参数依赖
- javascript - 我无法在 java 脚本中将 .duration 或 .currentTime 转换为 MM:SS
- azure - Azure Storage Account Firewall Permissions for Vulnerability Assessment
- python - How to addition two value in list of list
- powershell - 如何在 get-eventlog 中排除特定用户
- regex - how can I make a regex with a range specific to a number [1-7543]?
- java - NoClassDefFoundError and ClassNotFoundException when using custom library
- python - 速卖通网络刮刀不重复
- javascript - Variable not updating in recursive call