Учитывая выдуманный F
типа класс:Использования `неявного def`
scala> trait F[A] {}
defined trait F
и это определение, которое использует context bound
требовать, чтобы входная A
имеет типа класс экземпляр F
:
scala> def f[A : F](x: A) = ???
f: [A](x: A)(implicit evidence$1: F[A])Nothing
я определил экземпляр в Person
и тип класса:
scala> case class Person(name: String)
defined class Person
scala> implicit val person: F[Person] = new F[Person] {}
person: F[Person] = [email protected]
И следующие компилирует:
scala> f(Person("foo"))
scala.NotImplementedError: an implementation is missing
Но нет никакого String
реализации, поэтому она выходит из строя.
scala> f("foobar")
<console>:17: error: could not find implicit value for evidence parameter of type F[String]
f("foobar")
^
Затем я определил F[String]
с помощью:
scala> implicit def fInstance(x: String) = new F[String] {}
fInstance: (x: String)F[String]
Но, я не могу запустить:
scala> f("foobar")
<console>:18: error: could not find implicit value for evidence parameter of type F[String]
f("foobar")
^
, так как я не неявное F[String]
, а скорее String => F[String]
.
Что такое правильный способ использовать такую implicit def
для удовлетворения F[String]
ограничения, то есть вызов функции f
успешно с типом String
?
Я получил его на работу через:
scala> implicit val x: F[String] = implicitly[String => F[String]].apply("foobar")
x: F[String] = [email protected]
scala> f("foobar")
scala.NotImplementedError: an implementation is missing
at scala.Predef$.$qmark$qmark$qmark(Predef.scala:230)
at .f(<console>:12)
... 33 elided
Но я не уверен, если это правильный/чистый способ сделать это.
Это действительно сложно ответить, не зная, какую информацию и операции должен использовать класс типа, но с учетом этого конкретного 'F' вы можете определить экземпляр' String' точно так же, как вы делали 'Person' пример. –
Для этого случая я могу только построить 'F [String]', если при условии 'String', то есть экземпляр' F [String] 'зависит от аргумента' String'. –
В качестве продолжения, плохо ли использовать «неявный» вне класса-компаньона, т. Е. Сиротский «неявный» экземпляр? –