2016-07-30 73 views
3

我有一個字符串HList:一種類型的同質HList映射到不同類型的hetergenous 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 

我要轉「字符串「,即我的字符串HList,轉換爲混合類型的HList,對應於」書籍「列表。如果我有一個方法從字符串 - >標題,並從字符串 - >作者的方法,我覺得這應該是非常直接的本質上得到「字符串」作爲「書」的實例 - 清單型使用不成形,但我似乎無法想出一個辦法。

編輯

我的使用情況,這涉及對開始作爲case類HLists工作。我使用無形,因爲我希望能夠以相同的方式轉換和修改不同案例類的數據,而不必對案例類的形狀進行硬編碼,我只想知道它們的值的類型。因此,理想的這種方法也將努力從字符串列表看起來像這樣的打算:

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「,因爲我有兩個列表。

回答

2

您可以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

+0

感謝您讓我回到這麼快特拉維斯!我對這個問題進行了編輯,因爲我擔心zipApply並不適合我的情況。我也試過問一些更具體和詳細的​​問題[這裏](http://stackoverflow.com/questions/38684994/using-shapeless-to-extract-data-from-case-classes-modify-it-and-recreate -c)以防萬一沒有簡單的方法來做我想做的事情,而我正從錯誤的角度來處理問題。反正,謝謝! –

相關問題