Scala monads - ошибка "значение карты не является членом" - PullRequest
0 голосов
/ 20 апреля 2019

Я создал простой 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? Идея этого состоит в том, чтобы вернуть тот же объект, который задан в качестве параметра, но со случайным идентификатором.

Я подумал, что, возможно, мне нужен экземпляр нового Bet класса, но тогда я не смог вернуть его как F[_], как мне кажется.

1 Ответ

3 голосов
/ 20 апреля 2019

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
...