#scala #generics #shapeless
Вопрос:
Бесформенный » HListOps
включает в себя ряд полезных функций для их разнородного HList
типа. Я не мог найти эквивалент для HMap
.
Вот моя цель. У меня есть простой Map[String, String]
, который используется в качестве хранилища параметров в конвейере обработки сообщений во многих местах моего приложения. Теперь я хотел бы добавить что-то другое (Key => Value)
к этой карте, преобразовав ее в HMap, чтобы это могло быть что-то вроде:
class HOptionsMap[K, V]
implicit val intToString = new HOptionsMap[String, String]
implicit val stringToInt = new HOptionsMap[String, Instant]
Поэтому я мог бы в дальнейшем использовать его следующим образом:
val hm = HMap[HOptionsMap]("placeOfIncident" -> "Toronto", "incidentDate" -> Instant.now)
За исключением того, что я хотел бы вызывать операции, подобные collect, fold, filter
приведенным выше, которые не поддерживаются (в отличие от с HList
). Это требование необходимо для того, чтобы не нарушать текущую функциональность.
Конечно, я мог бы использовать композицию здесь, но мне было бы любопытно, будет ли это достижимо с Бесформенной библиотекой.
Ответ №1:
Если HMap
это неудобная абстракция для вашего варианта использования, попробуйте использовать запись
import shapeless.syntax.singleton._
val hm = "placeOfIncident" ->> "Toronto" :: "incidentDate" ->> Instant.now :: HNil
Вы можете собирать, складывать, фильтровать его как любой список/запись.
https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#extensible-records