Котята - неоднозначный импорт - PullRequest
1 голос
/ 29 мая 2019

Я почти полностью взял следующий код из приведенного здесь примера «получить представление»: https://github.com/milessabin/kittens

import cats._, cats.derived._, cats.implicits._

object Test extends App {

  case class Address(street: String, city: String, state: String)

  case class ContactInfo(phoneNumber: String, address: Address)

  case class People(name: String, age: Double,  contactInfo: ContactInfo)

  val mike = People("Mike", 1.23,  ContactInfo("202-295-3928", Address("1 Main ST", "Chicago", "IL")))

  implicit val addressShow: Show[Address] = new Show[Address] {
    def show(a: Address) = s"${a.street}, ${a.city}, ${a.state}"
  }

//  I would like to use a custom version of Show for Doubles...
//  implicit val doubleShow: Show[Double] = new Show[Double] {
//    def show(d: Double) = s"Custom Double Show: $d"
//  }

  implicit val peopleShow: Show[People] = {
    import auto.show._
    semi.show
  }

  println(mike.show)

}

Я бы хотел использовать пользовательскую версию Show [Double] (Я не очень, но это хороший минимальный пример, который иллюстрирует проблему, которая у меня есть на самом деле)

Если я откомментирую свой doubleShow, я получаю следующую ошибку:

Error:(25, 10) ambiguous implicit values:
 both value emptyProductDerivedShow in trait MkShowDerivation of type => cats.derived.MkShow[shapeless.HNil]
 and method emptyCoproductDerivedShow in trait MkShowDerivation of type => cats.derived.MkShow[shapeless.CNil]
 match expected type cats.derived.MkShow[A]
    semi.show

Как я могу заставить это работать?Я бы ожидал, что мои локальные пристрастия выиграют у любого импортируемого из кошек ...

1 Ответ

2 голосов
/ 29 мая 2019

Попробуйте неявный объект вместо неявного val

implicit object doubleShow extends Show[Double] {
  def show(d: Double) = s"Custom Double Show: $d"
}

или используйте неявный val и измените импорт (не import cats.instances.double._)

import cats._, cats.derived._
import cats.syntax.show._
import cats.instances.string._ // People uses String and Double

implicit val doubleShow: Show[Double] = new Show[Double] {
  def show(d: Double) = s"Custom Double Show: $d"
}
...