Во-первых, похоже, что он работает на address
, а также name
в вашем закомментированном выводе, что и следовало ожидать.Он не работает на friends
, потому что List[Person]
соответствует случаю skipCase
- это ни Option[String]
, ни List[String]
.
Самый простой способ исправить это - использовать комбинатор everywhere
Shapeless,Учитывая приведенный выше код, вы можете написать следующее:
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]
case или более общий регистр, который будет соответствовать типам, подобным этому, и применять trimmer
рекурсивно.Так как вы говорите, что хотите обрезать все строки, тем не менее, everywhere
звучит так, как будто вы хотите.