我正在嘗試學習無形(使用版本2.10.2)。我創建了一個非常簡單的可擴展的記錄:將無形可擴展記錄傳遞給函數
val rec1 = ("foo" ->> 42) :: HNil
按照REPL,這有鍵入
shapeless.::[Int with shapeless.record.KeyTag[String("foo"),Int],shapeless.HNil]
我試圖定義一個簡單的函數:
def fun(x: ::[Int with KeyTag[String("foo"), Int], HNil]) = x("foo")
但它甚至沒有編譯。我不能在類型聲明中使用一個String(「foo」),並得到一個錯誤。
我有兩個問題:
- 我如何指定在我的代碼的可擴展記錄的類型?
- 當處理具有更多字段的記錄時,類型聲明的長度和複雜性將無法管理。有沒有辦法爲這個類型創建一個別名,給定一個特定的記錄實例或其他解決方法?
編輯
我發現:
val rec1 = ("foo" ->> 42) :: HNil
val rec2 = ("foo" ->> 43) :: HNil
var x = rec1
x = rec2
效果很好。我得出結論rec1,rec2和x是相同的類型。我只是不知道如何在代碼中表達這種類型!
邁爾斯在Twitter上寫道(https://twitter.com/milessabin/status/388623399624646656)他可能能夠「在2.0.0版本之前刪除一些語法混亂」。 –
如果我們有很多好玩的功能,我們必須重複每個隱含的參數。如果這些函數必須訪問多個字段(例如:foo,bar,...),那麼這將是痛苦的和錯誤的。有沒有辦法將選擇器的聲明分解? – bhericher