我已經編寫了一個解析器,它按照一些規則將字符串轉換爲Seq [String]。這將用於圖書館。以類型安全的方式將Seq [String]轉換爲一個case類
我試圖將此Seq [String]轉換爲案例類。案例類將由用戶提供(所以沒有辦法猜測它會是什麼)。
我以爲沒有形狀的圖書館,因爲它似乎實現了良好的功能,它似乎成熟,但我不知道如何進行。
我發現了這個問題with an interesting answer但我找不到如何改變它以滿足我的需求。的確,在答案中只有一種類型需要解析(String),並且庫在String內部進行迭代。這可能需要對事情做出深刻的改變,我不知道如何做。
此外,如果可能的話,我希望爲我的圖書館的用戶儘可能簡化該過程。所以,如果可能的話,不像上面鏈接中的答案,HList類型可以從case類本身猜測(不過根據我的搜索,似乎編譯器需要這些信息)。
我對類型系統和所有這些美麗的東西有點新,如果有人能夠給我一個關於如何做的建議,我會非常高興!
親切的問候
---編輯---
由於ziggystar要求,這裏是一些可能需要的簽名:
//Let's say we are just parsing a CSV.
@onUserSide
case class UserClass(i:Int, j:Int, s:String)
val list = Seq("1,2,toto", "3,4,titi")
// User transforms his case class to a function with something like:
val f = UserClass.curried
// The function created in 1/ is injected in the parser
val parser = new Parser(f)
// The Strings to convert to case classes are provided as an argument to the parse() method.
val finalResult:Seq[UserClass] = parser.parse(list)
// The transfomation is done in two steps inside the parse() method:
// 1/ first we have: val list = Seq("1,2,toto", "3,4,titi")
// 2/ then we have a call to internalParserImplementedSomewhereElse(list)
// val parseResult is now equal to Seq(Seq("1", "2", "toto"), Seq("3","4", "titi"))
// 3/ finally Shapeless do its magick trick and we have Seq(UserClass(1,2,"toto"), UserClass(3,4,"titi))
@insideTheLibrary
class Parser[A](function:A) {
//The internal parser takes each String provided through argument of the method and transforms each String to a Seq[String]. So the Seq[String] provided is changed to Seq[Seq[String]].
private def internalParserImplementedSomewhereElse(l:Seq[String]): Seq[Seq[String]] = {
...
}
/*
* Class A and B are both related to the case class provided by the user:
* - A is the type of the case class as a function,
* - B is the type of the original case class (can be guessed from type A).
*/
private def convert2CaseClass[B](list:Seq[String]): B {
//do something with Shapeless
//I don't know what to put inside ???
}
def parse(l:Seq[String]){
val parseResult:Seq[Seq[String]] = internalParserImplementedSomewhereElse(l:Seq[String])
val finalResult = result.map(convert2CaseClass)
finalResult // it is a Seq[CaseClassProvidedByUser]
}
}
庫裏面的一些隱性將提供給將字符串轉換爲正確的類型,因爲它們被Shapeless猜出(類似於上面鏈接中提出的回答)。像string.toInt,string.ToDouble等...
可能還有其他方法來設計它。這正是我在幾個小時玩完無形之後所想到的。
你可以發佈代碼來說明你期望的結果嗎?只是方法簽名將會很好。也許用'library'和'user'來註釋它們。 – ziggystar
你可以舉一個調用convert2CaseClass的例子,也可以解析結果應該是什麼? –
@DidierDupont我按照要求在庫中添加了一些可能的實現。結果應該是案例類的列表。 Seq [String] - > Seq [Seq [String]] - > Seq [case class]。第一個轉換已經被編碼。第二個是我需要幫助的那個。 – pommedeterresautee