Использование фильтра в бесформенном, Scala
Это легко фильтровать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
Очень интересно, почему он компилируется и работает некорректно? Я думаю, что это не работает, потому что объект не может принимать параметры типа таким образом ...