вот такой extension метод
object StringExtensions {
extension [F[_]](str: String)(using ApplicativeError[F, Throwable]) {
def doSomething[T: Decoder]: F[T] = ???
}
}
В коде я могу вызвать его вот так
str.doSomething[Apple]
явно указав тип T, но не указывая F[_]. Вот у меня возникла проблема, ambiguous implicits и нужно F указать явно. Вопрос в том как это сделать. Пробовал
str.[IO]doSomething[Apple]
str[IO].doSomething[Apple]
не сработало
похоже что тайп аргументы плохо стакаются с экстеншенами. попробуйте вот так extension (str: String) def doSomething[F[_], T: Decoder](using ApplicativeError[F, Throwable]): F[T] = ???
с этим синтаксисом тоже есть ньюанс. Fку указать мне надо только в одном месте (в тесте). В других местах тип Fки хорошо подхватывается сам. А вот тип T надо указывать всегда. И не хотелось бы каждый раз строчить str.doSomething[F, Apple]
не думаю, что удастся избежать явной передачи типа, который не определяется по типу аргументов, сейчас есть экспериментальное, но уже задепрекейченное расширение https://dotty.epfl.ch/docs/reference/experimental/named-typeargs.html в будущих версиях его планируют заменить на частичное применение тайп-параметров
> в будущих версиях его планируют заменить на частичное применение тайп-параметров ну хоть так )
а почему задепрекейтили? Выглядит как что-то, что лучше иметь, чем не иметь
наверное полагают, что частичное применение лучше
Если в одном месте, то можно просто вызвать метод как обычный, не-экстеншн, тогда можно явно передать тайп параметры. doSomething[IO](str)[Apple]
Обсуждают сегодня