【问题标题】:Can one convert an "Either" list to an "HList" in Haskell?可以在 Haskell 中将“Either”列表转换为“HList”吗?
【发布时间】:2013-09-29 18:41:11
【问题描述】:

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

[Left 1, Right False, Left 2]

会变成

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

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

【问题讨论】:

    标签: haskell


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我很怀疑......这个编译时间限制是否意味着 HList 几乎是元组(加上一个公认有用的附加函数)?
    • 是的,就该属性而言,它们非常相似。事实上,使用最原始的方法,您的 HList 可以编码为(1, (False, (2, ()))。然而,HLists 的强大之处在于类型级(编译时)编程。但它们的实际应用领域非常有限,似乎学术性大于实用性。研究类型族可能有助于理解 HList 的用途。
    【解决方案2】:

    请参阅this post by Oleg,了解如何使用 HList 进行可扩展变体。

    【讨论】:

    • 我读了这篇文章,发现它很有趣,虽然它没有解决我的问题....这是对 HList 是什么的描述(他们自制而不是使用 Data.HList ,但这是相同的想法)。我错过了什么?正如 Nikita 所指出的,转换函数的类型甚至不一致,所以这似乎是不可能的。
    • Hackage 上的 HList 版本是自制的,Oleg 是原版的 :) 。这篇文章展示了如何根据 HList 对总和类型(又名变体,又名“诸如此类的东西”)进行编码,方法是将左/右构造函数实现为 HList 记录上的选择器函数,表示您要应用于“要么”。它不会像这样转换,不。
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2011-03-05
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多