很容易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
非常有趣,为什么它编译和工作不正确?因为我认为它不起作用,导致对象不能以这种方式接受类型参数......