Легко отфильтровать HList
в бесформенных по типу:
val hlist = 1 :: 2 :: "3" :: true :: false :: HNil
hlist.filter[Int]
Но как я могу создать фильтр собственного типа? Я хочу что-то вроде этого: например, я получил список некоторых функций:
def function1(s: String) = s.toInt
def function2(s: String) = s.toDouble
def function3(i: Int) = i.toDouble
val hflist = function1 _ :: function3 _ :: function2 _ :: HNil
hflist customFilter[String] //> function1 _ :: function2 _ :: HNil
Таким образом, после использования этого фильтра будет построен список функций из типа String
в какой-либо другой тип.
У меня была идея использовать карту для этого, но она не увенчалась успехом.
ВЕРСИЯ
Подробнее о моем комментарии:
Я попытался проверить эти идеи на карте:
Итак, если у меня есть несколько списков (давайте поработаем с hlist
и hflist
):
object allFunction extends Poly1 {
implicit def default[T, M] =
at[T => M](t => {
object grabStringFunc extends skip {
implicit def stringFunc[A] = at[T => A](_ :: HNil)
}
println(hflist flatMap grabStringFunc) //> here we should see result, list of functions
})
hlist map allFunction
//> result of this should be smth like (types)
//> shapeless.::[Int => Double,shapeless.HNil]]
//> shapeless.::[Int => Double,shapeless.HNil]]
//> shapeless.::[String => Int,shapeless.::[String => Double,shapeless.HNil]]
//> shapeless.HNil
//> shapeless.HNil
Очень интересно, почему он компилируется и работает некорректно? Как я думаю, это не работает, потому что объект не может принимать параметры типа таким образом...