scala - 如何使用 HList 调用多个参数的函数?

标签 scala shapeless

假设我有一个 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 的语法成Function1服用 HList :

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/

相关文章:

scala - Spark MLlib/K-Means 直觉

scala - 理解 Scala 类型系统中的辅助模式

scala - 我可以用简单的方法在 Scala 中获取未包装的单例类型吗?

scala - 同时获得见证人和类型类

scala - Circe 解码为由多个案例类扩展的密封特征

scala - 在 Scala 中合并两个 MultiMap

scala - 如何修复在intellij中使用binging.scala时出现的红色标记?

scala - 工具箱导入错误

scala - 如何仅使泛型可接受彼此不相关的少数数据类型

scala - Circe:将隐式编码器移至通用类中