假设我有一个类型为A :: B :: C :: HNil的HList和一个函数(A,B,C)=> d
val hlist: A::B::C::HNil = ??? def foo(a: A,b: B,c: C): D = ???
现在我需要一个功能A :: B :: C :: HNil => D,使用foo返回D.
def bar(hslist: A::B::C::HNil): D = ???
你会如何实现吧?
解决方法
您可以使用Shapeless的FnToProduct直接执行此操作,它提供了用于将FunctionN转换为带有HList的Function1的产品语法:
import shapeless._,Syntax.std.function._ type A = String type B = Symbol type C = Int type D = List[String] val hlist: A :: B :: C :: HNil = "foo" :: 'x :: 1 :: HNil def foo(a: A,c: C): D = List.fill(c)(a + b) def bar(hslist: A :: B :: C :: HNil): D = (foo _).toProduct.apply(hslist)
在许多情况下,您可能甚至不想要单独的条形定义.