例如,假设我有一个 [Either Int Bool],我想将其转换为 HList.... 所以
[Left 1, Right False, Left 2]
会成为
1 .*. False .*. 2 .*. HNil
(我实际上认为这是不可能的,但很想听到其他情况......即使为这样的函数编写类型似乎也是不可能的,尽管也许有一种方法可以做到这一点,而不仅仅是编写一个函数)。
例如,假设我有一个 [Either Int Bool],我想将其转换为 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 具有什么值的信息必须可供编译器使用才能确定其类型。在您的情况下,您只能在运行时获得此值,即当程序已经编译时。
请参阅Oleg的这篇文章,了解如何使用 HList 进行可扩展变体。