2016-09-01 3 views
3

Дано:Складывание по HList?

import shapeless._ 
case class F(x: Option[Int], y: Option[Int]) 

Я хотел бы помочь написать функцию, f:

def f(Option[Int] :: Option[Int] :: HNil): String

таким образом, что каждый Option[Int] это заменить с Some числом или empty; и "" для HNil.

Пример:

val res7 = Generic[F].to(F(Some(42), None)) 
//res7: shapeless.::[Option[Int],shapeless.:: 
     [Option[Int],shapeless.HNil]] = Some(42) :: None :: HNil 

f(res7) === "42empty" 

Как f быть написано?

ответ

2

Вам нужен Poly:

object OptFolder extends Poly2{ 
    def conv(x: Option[Int]) = x.map(_.toString).getOrElse("empty") 

    implicit val ff = at{ (y: String, z: Option[Int]) => y + conv(z) } 
} 

val lala: String = myHlist.foldLeft("")(OptFolder) //:String not required 

Так Generic превратить в HList, а затем foldLeft с хорошо определенным Poly.

+0

Спасибо, @wheaties. В чем смысл 'conv', т. Е. Имя функции? –

+0

О, я просто привел его, чтобы он был более читабельным. – wheaties

Смежные вопросы