2014-09-23 56 views
1

任何人都可以解釋的類型別名VSλ型

type VNel[+A] = ValidationNel[String, A] 
x.sequence[VNel, .... 

的優點/缺點VS

x.sequence[({ type l[a] = ValidationNel[String, a] })#l, .... 

據我瞭解,使用結構類型招致不必使用反射的運行時性能損失。

回答

3

類型lambda是一種內聯表達複雜類型的方法。

類型別名是方式創建類型的標識符。它可以是一個複雜的類型或像type UserId = Int一樣簡單。當您不止一次需要複雜類型時,或者您想通過分解部分來簡化複雜簽名時,它非常有用。

類型lambdas和類型別名都不是結構類型。而是一種表達類型的方式。

有關lambda表達式類型的詳細信息: https://stackoverflow.com/a/8737611/547564

+4

具體而言,類型lambda中結構類型的使用沒有運行時成本,與在運行時訪問結構類型的成員時不同。 – mpilquist 2014-09-24 01:49:58

1

它們非常類似 - 無論使用哪你找到更清晰。海事組織的類型別名通常更具可讀性。在寫作要擴展的特徵(或類)的上下文中,類型lambda可以更清晰,因爲它可以防止重寫類型,但這非常具有邊緣情況。

在普通代碼中訪問結構類型中定義的值確實會產生使用反射的代價。但是在lambda類型中,結構類型僅用作泛型類型參數,它將在運行時擦除。所以不會有運行時性能的影響。

如果您正在廣泛使用lambda類型,您可能會考慮使用類型投影機插件,它提供了更方便的語法(並避免了與結構類型誤導的視覺相似性)。