例如,假設我有一個[是int BOOL],我想將它轉化成一個HList ....所以可以將Haskell中的「Either」列表轉換爲「HList」嗎?
[Left 1, Right False, Left 2]
將成爲
1 .*. False .*. 2 .*. HNil
(其實我覺得這是不可能的,但是很想聽到別的......甚至爲這樣的函數寫類型似乎也是不可能的,儘管也許有一種方法可以做到這一點,而不僅僅是寫一個函數)。
例如,假設我有一個[是int BOOL],我想將它轉化成一個HList ....所以可以將Haskell中的「Either」列表轉換爲「HList」嗎?
[Left 1, Right False, Left 2]
將成爲
1 .*. False .*. 2 .*. HNil
(其實我覺得這是不可能的,但是很想聽到別的......甚至爲這樣的函數寫類型似乎也是不可能的,儘管也許有一種方法可以做到這一點,而不僅僅是寫一個函數)。
您不能轉換[Either Int Bool]
到HList,因爲它是一個動態值,而是一個HList具有取決於其值的靜態類型。考慮以下幾點:
1 .*. False .*. 2 .*. HNil
具有類型HCons 1 (HCons False (HCons 2 HNil))
1 .*. HNil
有類型HCons 1 HNil
兩個的這些值是你應該轉換功能的可能的結果,但他們有不同的類型。
上面的一切都是因爲什麼重視HList也必須是可用的編譯器,以找出它的類型的信息。在你的情況下,你只能在運行時獲得這個值,即當程序已經被編譯時。
參見該怎麼辦擴展變種HList this post by Oleg。
我懷疑很多....這難道不是編譯時間的限制意味着HLists是幾乎元組(加上一個公認有用的附加功能)? – jamshidh
是的,通過該屬性他們非常相似。事實上,使用最原始的方法,你的HList可以被編碼爲'(1,(False,(2,()))'。然而,HList的威力在類型級(編譯時)編程中,其應用的實際領域是非常有限的,似乎大於實際學業。學習型家庭可能有很大的幫助理解HLists的目的。 –