несоответствие типов; найдено: cats.Show [shapeless.CNil] обязательно: cats.Show [A] после добавления скалярного параметра -Ypartial-unification в sbt - PullRequest
0 голосов
/ 10 января 2019

У меня есть код ниже.

import enumeratum.{Enum, EnumEntry}

sealed abstract class AppEnvironment extends EnumEntry

object AppEnvironment extends Enum[AppEnvironment] {
  case object Local extends AppEnvironment
  case object Testing extends AppEnvironment
  case object Production extends AppEnvironment

  override val values: Vector[AppEnvironment] =
    findValues.toVector
}

import java.net.InetAddress
import ciris.Secret
import eu.timepit.refined.types.net.UserPortNumber
import scala.concurrent.duration.Duration

final case class ApiConfig(
  host: InetAddress,
  port: UserPortNumber,
  apiKey: Secret[ApiKey],
  timeout: Duration
)


import java.net.InetAddress
import cats.Show
import cats.derived._
import cats.implicits._
import ciris.Secret
import ciris.cats._
import enumeratum.EnumEntry
import eu.timepit.refined.auto._
import eu.timepit.refined.cats._
import eu.timepit.refined.types.net.UserPortNumber
import eu.timepit.refined.types.string.NonEmptyString
import is.cir.example.domain.config.AppEnvironment.{Local, Production, Testing}
import scala.concurrent.duration._

final case class Config(
  appName: NonEmptyString,
  environment: AppEnvironment,
  api: ApiConfig
)


object Config {

  import cats.implicits._

  implicit val showConfig: Show[Config] = {

    implicit val showInetAddress: Show[InetAddress] =
      Show.fromToString

    implicit def showEnumEntry[E <: EnumEntry]: Show[E] =
      Show.show(_.entryName)

    semi.show
  }
}

Мне нужно добавить скалярную опцию -Ypartial-unification в build.sbt, чтобы решить другую проблему, после добавления я получаю еще одно исключение, которого раньше не было (без флага).

Ошибка -

[error] /Users/rajkumar.natarajan/Documents/Coding/OS/ciris-example/src/main/scala/is/cir/example/domain/config/Config.scala:38:10: type mismatch;
[error]  found   : cats.Show[shapeless.CNil]
[error]  required: cats.Show[is.cir.example.domain.config.Config]
[error]     semi.show
[error]          ^
[error] one error found

Как я могу устранить эту ошибку?

1 Ответ

0 голосов
/ 10 января 2019

Вы должны назвать его, указав параметр типа

semi.show[Config]

По крайней мере, сообщение об ошибке отличается от

Error:(82, 14) diverging implicit expansion for type cats.derived.MkShow[is.cir.example.domain.config.Config]
starting with value tagRefType in object RefType
    semi.show[Config]

Вы можете попробовать поиграть со своими Show экземплярами. Чтобы иметь Show для "большего" класса, вы должны иметь Show для "меньшего" класса.

implicitly[Show[Config]]
implicitly[Show[AppEnvironment]]
implicitly[Show[AppEnvironment.Local.type]]
//...
implicitly[Show[ApiConfig]]
implicitly[Show[InetAddress]]
//...
...