2015-11-13 88 views
2

我正在尋找一種可以將一種HList類型與另一種HList類型相減的類型構造函數。用於減去HList類型的類型構造函數?

trait Subtract { 
    type Aux[Full <: HList, ToSubract <: HList] = ??? 
} 

object SubtractExample { 
    type AList = ClassA :: ClassB :: HNil 
    type BList = ClassB :: HNil 

    Subtract.Aux[AList, BList] == ClassA :: HNil 
} 

如果這樣的構造函數不存在,有人可以指示我如何實現它的方向嗎?謝謝!

回答

4

如果AList將始終包含在訂單BList元素(但不是一定是連續的),你可以使用RemoveAll

import shapeless._, ops.hlist.RemoveAll 

trait ClassA; trait ClassB 

type AList = ClassA :: ClassB :: HNil 
type BList = ClassB :: HNil 

val remover = RemoveAll[AList, BList] 

remover(new ClassA {} :: new ClassB {} :: HNil) 

這將返回刪除元素的元組和剩菜(這是什麼你要)。

這適用於您的示例,即使您的要求稍有不同,the RemoveAll implementation也是一個很好的開始。

作爲腳註,雖然RemoveAll類型的構造函數,在這種情況下,它更相關地是一個類型類。如果有一個沒有類型參數的類型類,但是使用兩個參數(通常在伴隨對象中定義,而不是類型類本身)也沒有意義。作爲這種模式的一個例子,我建議看看AuxRemoveAll類型類中扮演的角色。