假设我有一个HList类型的A::B::C::HNil和一个函数(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 = ???

您将如何实现bar

最佳答案

您可以使用Shapeless的FnToProduct来更直接地执行此操作,它提供了toProduct语法,可以将FunctionN转换为采用Function1HList:

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, b: B, c: C): D = List.fill(c)(a + b)

def bar(hslist: A :: B :: C :: HNil): D = (foo _).toProduct.apply(hslist)

在许多情况下,您甚至可能根本不需要单独的bar定义。

关于scala - 如何使用HList调用多个参数的功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31588877/

10-12 19:43