2013-09-29 35 views
3

例如,假设我有一个[是int BOOL],我想将它转化成一个HList ....所以可以将Haskell中的“Either”列表转换为“HList”吗?

[Left 1, Right False, Left 2] 

将成为

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

(其实我觉得这是不可能的,但是很想听到别的......甚至为这样的函数写类型似乎也是不可能的,尽管也许有一种方法可以做到这一点,而不仅仅是写一个函数)。

回答

1

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

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

两个的这些值是你应该转换功能的可能的结果,但他们有不同的类型。

上面的一切都是因为什么重视HList也必须是可用的编译器,以找出它的类型的信息。在你的情况下,你只能在运行时获得这个值,即当程序已经被编译时。

+0

我怀疑很多....这难道不是编译时间的限制意味着HLists是几乎元组(加上一个公认有用的附加功能)? – jamshidh

+0

是的,通过该属性他们非常相似。事实上,使用最原始的方法,你的HList可以被编码为'(1,(False,(2,()))'。然而,HList的威力在类型级(编译时)编程中,其应用的实际领域是非常有限的,似乎大于实际学业。学习型家庭可能有很大的帮助理解HLists的目的。 –

1

参见该怎么办扩展变种HList this post by Oleg

+0

我阅读后,发现它很有趣,尽管它不处理我的问题....它是一个HList的描述(它们是自制的,而不是使用Data.HList,但它是一样的想法)。我错过了什么?正如Nikita指出的那样,转换函数的类型是n甚至连一致,所以这似乎是不可能的。 – jamshidh

+0

Hackage上的HList版本是自制软件,Oleg's原创:)。这篇文章展示了如何在HList方面编码和类型(又名变种,也就是“Either”等),通过在HList记录上实现左/右构造函数作为选择函数来表示要应用于“要么“。它不*转换*,因此,不。 – barsoap

相关问题