Mapear y reducir / doblar HList de scalaz. Validación

Empecé con algo como esto:

def nonEmpty[A] = (msg: String) => (a: Option[A]) => a.toSuccess(msg)

val postal: Option[String] = request.param("postal")
val country: Option[String] = request.param("country")

val params =
  (postal  |> nonEmpty[String]("no postal" )).toValidationNel |@|
  (country |> nonEmpty[String]("no country")).toValidationNel

params { (postal, country) => ... }

Ahora pensé que sería bueno reducir la repetitiva para una mejor legibilidad y para no tener que explicar a más miembros del equipo junior qué.toValidateNel y|@| media. El primer pensamiento fueList pero luego la última línea dejaría de funcionar y tendría que renunciar a cierta seguridad estática. Entonces miré hacia Shapeless:

import shapeless._; import poly._; import syntax.std.tuple._

val params = (
  postal  |> nonEmpty[String]("no postal"),
  country |> nonEmpty[String]("no country")
)

params.map(_.toValidatioNel).reduce(_ |@| _)

sin embargo, parece que ni siquiera puedo pasar el.map(...) poco. He intentado según una sugerencia en #scalaz:

type Va[+A] = Validation[String, A]
type VaNel[+A] = ValidationNel[String, A]

params.map(new (Va ~> VaNel) { def apply[T](x: Va[T]) = x.toValidationNel })

...en vano.

He pedido ayuda en #scalaz, pero no parece algo a lo que la gente solo tenga una respuesta inmediata. Sin embargo, estoy realmente interesado en aprender cómo resolver esto tanto para fines prácticos como de aprendizaje.

PD en realidad mis validaciones están envueltas dentroKleisli[Va, A, B] para poder componer pasos de validación individuales usando>=> pero eso parece ser ortogonal al problema para cuando.map(...) se alcanza, todoKleislis habrá sido "reducido" aValidation[String, A].

Respuestas a la pregunta(1)

Su respuesta a la pregunta