Nano Hash - криптовалюты, майнинг, программирование

Обрезать значения строковых полей класса case

Я пишу общую функцию, используя shapeless, которая принимает экземпляр case class и обрезает все значения полей, которые нить. Класс case может иметь необязательные поля, вложенные объекты, списки и т. д.

У меня есть класс корпуса Person.

case class Person(name: Option[String], address: List[String], friends: List[Person])

Функция, которая у меня есть на данный момент:

import shapeless._, ops.hlist._

  object trimmer extends Poly1 {
    implicit val stringOptCase = at[Option[String]](_.map(_.trim))
    implicit val stringListCase = at[List[String]](_.map(_.trim))
    implicit def skipCase[A] = at[A](identity)
  }

  def trimStringValues[A, R <: HList](a: A)(implicit
                                     gen: Generic.Aux[A, R],
                                     mapper: Mapper.Aux[trimmer.type, R, R]
  ) = gen.from(mapper(gen.to(a)))

Когда я использую вышеуказанную функцию, она работает только для поля name корневого уровня класса Person. Это не работает для списка или поля объекта.

val person = Person(name = Some(" john "), address = List(" ny"," vegas "), friends = List(Person(Some(" alicia"), List(" peter"), Nil)))

trimStringValues(person) // Person(Some(john),List(ny, vegas),List(Person(Some( alicia),List( peter),List())))

Как я могу это решить?

08.02.2019

Ответы:


1

Во-первых, похоже, что он работает как с address, так и с name в вашем закомментированном выводе, чего и следовало ожидать. Это не работает с friends, потому что List[Person] соответствует случаю skipCase — это не Option[String] и не List[String].

Самый простой способ исправить это — использовать комбинатор Shapeless everywhere. Учитывая ваш код выше, вы можете написать следующее:

scala> shapeless.everywhere(trimmer)(person)
res1: Person = Person(Some(john),List(ny, vegas),List(Person(Some(alicia),List(peter),List())))

На самом деле вы можете сделать то же самое с еще более простой trimmer реализацией:

object trimStrings extends Poly1 {
  implicit val stringCase: Case.Aux[String, String] = at[String](_.trim)
}

Или эквивалентно, но еще более кратко:

import shapeless.poly.->

object trimStrings extends (String -> String)(_.trim)

А потом:

scala> shapeless.everywhere(trimStrings)(person)
res5: Person = Person(Some(john),List(ny, vegas),List(Person(Some(alicia),List(peter),List())))

Если вам нужен больший контроль над тем, какие именно строки обрезаются, вы можете вернуться к исходной реализации и либо добавить явный случай List[Person], либо более общий случай, который будет соответствовать типам, подобным этому, и применять trimmer рекурсивно. Поскольку вы говорите, что хотите обрезать все строки, everywhere звучит так, как будто это то, что вы хотите.

08.02.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..