scala - 将一种类型的同构 HList 映射到不同类型的异构 List

标签 scala shapeless

我有一个字符串的 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”列表。如果我有一个从字符串 -> Title 开始的方法,以及一个从字符串 -> Author 开始的方法,我觉得这应该非常简单,基本上可以将“strings”作为“book”-list 的一个实例-type 使用 shapeless,但我似乎想不出办法。

编辑

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

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”,因为我有两个列表。

最佳答案

您可以使用 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 类型类,而不是简单地在具有具体类型的 hlists 上调用 zipApply

关于scala - 将一种类型的同构 HList 映射到不同类型的异构 List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678055/

相关文章:

scala - Spark创建不接受输入的UDF

scala - 将 foreach 变量传递给 Spark sql 以在 Spark 中计算总和

scala - 使用 Shapeless 从 case 类派生新类型

scala - HList 的无形状类型推断不起作用

scala - HList.foldRight 在类型类的实现中使用时如何查找隐式?

scala - 如何从 scala Map 转换为 scala.collection.immutable.HashMap?

scala - 在 Scala 中,不可变列表共享内存吗?

java - 你能用 Guava 复制 Clojure 的(分区)或 Scala 的 sliding() 函数吗?

scala - 创建一个不丢失类型的泛化方法

scala - 为无形 hlist 定义 scalaz monad 实例