我创建了一个简单的trait
和服务:
@finalAlg
@autoFunctorK(true)
trait BettingService[F[_]] {
def put(bet: Bet): F[Bet]
}
class BettingServiceMock[F[_] : Async] extends BettingService[F] {
override def put(bet: Bet): F[Bet] = {
val id = randomUUID().toString
for {
created <- Bet(BetId(id), bet.stake, bet.name)
} yield created
}
}
Bet
和BetId
是case classes
:
case class Bet(betId: BetId, stake: BigDecimal, name: String)
case class BetId(betId: String) extends AnyVal
当我运行这个程序时,我收到一个错误:Error:(12, 21) value map is not a member of model.Bet <- Bet(BetId(id), bet.stake, bet.name)
这对我来说很奇怪 - 为什么我不能从for-comprehension
返回好的类型?这个想法是返回与参数给定的相同对象,但具有随机id。
我想也许我需要新的Bet
类的实例,但是我不能像我想的那样将它作为F[_]
返回。
Bet(BetId(id), bet.stake, bet.name)
是Bet
类型,但预期类型是F[Bet]
。
尝试
import cats.syntax.functor._
for {
created <- Applicative[F].pure(Bet(BetId(id), bet.stake, bet.name))
} yield created
要么
import cats.syntax.functor._
import cats.syntax.applicative._
for {
created <- Bet(BetId(id), bet.stake, bet.name).pure
} yield created
要么
Applicative[F].pure(Bet(BetId(id), bet.stake, bet.name))
要么
import cats.syntax.applicative._
Bet(BetId(id), bet.stake, bet.name).pure