例如,假设我有一个[是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的目的。 –