任何人都可以解釋的類型別名VSλ型
type VNel[+A] = ValidationNel[String, A]
x.sequence[VNel, ....
的優點/缺點VS
x.sequence[({ type l[a] = ValidationNel[String, a] })#l, ....
據我瞭解,使用結構類型招致不必使用反射的運行時性能損失。
任何人都可以解釋的類型別名VSλ型
type VNel[+A] = ValidationNel[String, A]
x.sequence[VNel, ....
的優點/缺點VS
x.sequence[({ type l[a] = ValidationNel[String, a] })#l, ....
據我瞭解,使用結構類型招致不必使用反射的運行時性能損失。
類型lambda是一種內聯表達複雜類型的方法。
類型別名是方式創建類型的標識符。它可以是一個複雜的類型或像type UserId = Int
一樣簡單。當您不止一次需要複雜類型時,或者您想通過分解部分來簡化複雜簽名時,它非常有用。
類型lambdas和類型別名都不是結構類型。而是一種表達類型的方式。
有關lambda表達式類型的詳細信息: https://stackoverflow.com/a/8737611/547564
它們非常類似 - 無論使用哪你找到更清晰。海事組織的類型別名通常更具可讀性。在寫作要擴展的特徵(或類)的上下文中,類型lambda可以更清晰,因爲它可以防止重寫類型,但這非常具有邊緣情況。
在普通代碼中訪問結構類型中定義的值確實會產生使用反射的代價。但是在lambda類型中,結構類型僅用作泛型類型參數,它將在運行時擦除。所以不會有運行時性能的影響。
如果您正在廣泛使用lambda類型,您可能會考慮使用類型投影機插件,它提供了更方便的語法(並避免了與結構類型誤導的視覺相似性)。
具體而言,類型lambda中結構類型的使用沒有運行時成本,與在運行時訪問結構類型的成員時不同。 – mpilquist 2014-09-24 01:49:58