AutoRefineV не получает явного вывода из карты?

У меня есть уточненное определение типа:

type D = String Refined Regex "(a|b)"

Я могу использовать уточнение в одной строке, выражающей значение, но по какой-то причине autoRefineV не улавливает его при использовании в контексте Карты, даже если тип явный. Например:

import eu.timepit.refined.auto.autoRefineV
val test1: D = "a" // this is fine
val test2 = Map[D, String]("a" -> "test") // this fails
val test3: Map[D, String] = Map("a" -> "test") // this also fails
val test4 = Map(test1 -> "test") // this works!

Ошибка, которую я получаю:

found : (String, String)
required : (D, String)

Значит, по какой-то причине значение не преобразуется автоматически из строки в тип D? Нужно ли определять уточненный объект типа Map[D, String]? Нужно ли мне использовать свидетель (который я понятия не имею, как использовать)?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть неявное преобразование из String в D, но для определения test2/3 потребуется преобразование из (String, String) в (D, String), которого не существует.

val test5 = Map(("a": D) -> "test")

должно работать, если вы просто хотите написать это в одну строку.

Спасибо. Я подумал, что это что-то вроде этого. Я попытаюсь написать имплицит, который делает это. Мне нужно что-то, что конвертирует String -> D, верно?

franklin 22.05.2019 21:15

Дополнительный вопрос, почему scala не распознает ключ как тип D? Даже если я явно укажу тип? Map[D, String]?

franklin 22.05.2019 21:20

«Мне нужно что-то, что преобразует String -> D, верно?» autoRefineV уже делает это (с дополнительными неявными аргументами). Вам нужно «поднять» его на пары.

Alexey Romanov 23.05.2019 00:48

"почему scala не распознает ключ как тип D?" Потому что то, что вы делаете с "a", вызывает -> его. Этот метод существует для любого типа (из-за другого неявного преобразования), и у Scala нет причин применять неявное преобразование к D перед его вызовом. (Если бы это было так, это были бы 2 отдельных неявных преобразования, которые он в любом случае даже не будет искать.)

Alexey Romanov 23.05.2019 00:52

Другие вопросы по теме