代码之家  ›  专栏  ›  技术社区  ›  user51

类型不匹配;找到:cats.show[shapeless.cnil]必需:cats.show[a]在sbt中添加scalac选项-ypartial universion之后

  •  0
  • user51  · 技术社区  · 6 年前

    我有下面的代码。

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

    我必须添加scalac选项 -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 回复  |  直到 6 年前
        1
  •  1
  •   Dmytro Mitin    6 年前

    您应该指定类型参数来调用它

    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 实例。为了有一个 对于“更大”的案例类,您应该 对于“小”的。

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