3

例如,假设我有一个 [Either Int Bool],我想将其转换为 HList.... 所以

[Left 1, Right False, Left 2]

会成为

1 .*. False .*. 2 .*. HNil

(我实际上认为这是不可能的,但很想听到其他情况......即使为这样的函数编写类型似乎也是不可能的,尽管也许有一种方法可以做到这一点,而不仅仅是编写一个函数)。

4

2 回答 2

1

您不能转换[Either Int Bool]为 HList,因为它是动态值,但 HList 具有取决于其值的静态类型。考虑以下:

  • 1 .*. False .*. 2 .*. HNil有类型HCons 1 (HCons False (HCons 2 HNil))
  • 1 .*. HNil有类型HCons 1 HNil

这两个值都是您假定的转换函数的可能结果,但它们具有不同的类型。

以上都是因为有关 HList 具有什么值的信息必须可供编译器使用才能确定其类型。在您的情况下,您只能在运行时获得此值,即当程序已经编译时。

于 2013-09-29T09:42:57.310 回答
1

请参阅Oleg的这篇文章,了解如何使用 HList 进行可扩展变体。

于 2013-09-29T10:41:11.103 回答