讓我們來看一個例子(這是一個天真的例子,但足以說明問題)。根據輸入參數返回不同類型
def produce(l: List[Int]) : Any =
l match {
case List(x) => x
case List(x, y) => (x, y)
}
val client1 : Int = produce(List(1)).asInstanceOf[Int]
缺點:客戶端需要投!
def produce2[A](l: List[Int])(f: List[Int] => A) = {
f(l)
}
val toOne = (l: List[Int]) => l.head
val toTwo = (l: List[Int]) => (l.head, l.tail.head)
val client2 : Int = produce2(List(1))(toOne)
缺點:類型安全性,即我們可以通過一個單例列表調用toTwo。
有沒有更好的解決方案?
標準斯卡拉'List'沒有抓住它的長度在其類型,所以你不能阻止'從toTwo'被稱爲列表元素太少的列表。使用「HList」(例如無形),可以做到這一點,因爲每個元素的類型(因此也就是內在的長度)是靜態已知的。如果我真的知道如何編寫特定的代碼,我會做出這個答案,但是我對Shapeless和'HList'的瞭解只是「理論上的」。無形:https://github.com/milessabin/shapeless –