【问题标题】:Map a homogenous HList of one type into a hetergenous HList of different types将一种类型的同构 HList 映射为不同类型的异构 List
【发布时间】:2016-07-31 22:03:49
【问题描述】:

我有一个字符串的 HList:

val strings = "The Lorax" :: "Dr. Suess" :: HNil

我是另一个特殊类型的 HList:

case class Title(title: String, words: List[String])
case class Author(firstName: String, lastName: String)
val book = Title("The Hobbit", List("Hobbit")) :: Author("J.R.R.", "Tolkien") :: HNil

我想把“strings”,我的字符串HList,变成一个混合类型的HList,对应“book”列表。如果我有一个从字符串-> 标题的方法,以及一个从字符串-> 作者的方法,我觉得这应该非常简单,基本上可以将“字符串”作为“书”-list 的一个实例-type 使用 shapeless,但我似乎想不出办法。

编辑

我的用例涉及处理从案例类开始的 HList。我使用 shapeless 是因为我希望能够以相同的方式转换和修改不同案例类的数据,而不必对案例类的形状进行硬编码,我只想知道它们的值的类型。因此,理想情况下,这种方法也适用于从如下所示的字符串列表中获取:

val strings2 = "Leonardo" :: "April O'Neil" :: "The Art of Pizza" :: HNil
val book2 = Author("Michaelangelo") :: Author("Donatello") :: Title("Slicing and Dicing"), List("Slicing", "Dicing") :: HList 

因此,我将始终提供它需要采用的格式的示例,但我不想将“作者”的数量和“书籍”的数量硬编码到翻译函数列表中。我想说“a,a,b”应该看起来像“A,A,B”,这是从“a -> A”开始的方法,这是从“b -> B”,但我希望能够使用相同的代码从“b,a,b”转到“B,A,B”,因为我有两个列表。

【问题讨论】:

    标签: scala shapeless


    【解决方案1】:

    您可以使用zipApply 很好地做到这一点,它将函数 hlist 的每个元素应用于另一个 hlist 中的相应元素:

    case class Title(title: String, words: List[String])
    case class Author(firstName: String, lastName: String)
    
    // For the sake of example:
    def parseTitle(s: String): Title = Title(s, s.split(' ').toList)
    def parseAuthor(s: String): Author =
      Author(s.takeWhile(_ != ' '), s.dropWhile(_ != ' ').tail)
    
    import shapeless._
    
    val funcs = parseTitle _ :: parseAuthor _ :: HNil
    val strings = "The Lorax" :: "Dr. Suess" :: HNil
    
    val book = funcs.zipApply(strings)
    

    然后:

    scala> println(book)
    Title(The Lorax,List(The, Lorax)) :: Author(Dr.,Suess) :: HNil
    

    如果您需要更通用,您可以使用 ZipApply 类型类,而不是简单地在具有具体类型的 hlist 上调用 zipApply

    【讨论】:

    • 感谢 Travis 这么快回复我!!我对这个问题进行了编辑,因为我担心 zipApply 对我的情况并不适用。我还尝试询问更具体和详细的​​问题here,以防万一没有简单的方法来做我想做的事情,而且我从错误的角度解决问题。总之,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    相关资源
    最近更新 更多