【问题标题】:Remove phantom type variable删除幻像类型变量
【发布时间】:2016-09-26 03:49:36
【问题描述】:

假设我有一些类型:

newtype Foo a b = Foo { getFoo :: SomeStructure b }

a 是一种幻象类型,仅用于编译时检查。

但是,我不想到处使用幻像类型。它在我的代码中并不是普遍有用的。所以我想做类似的事情:

type FooUnrestricted b = Foo Anything b

我应该用什么代替Anything?我需要一些语言扩展吗?

编辑:我意识到我可以简单地使用(),它会回答我的问题。但实际的一点是,我有对a 施加约束的函数,我希望它们始终得到满足。

【问题讨论】:

  • 也许你可以使用coerce

标签: haskell phantom-types


【解决方案1】:

一种选择是使用存在类型:

data UnrestrictedFoo b where
  Unrestricted :: Foo a b -> UnrestrictedFoo b

在其他一些情况下,改用 rank 2 类型可能更有意义。

newtype UnrestrictedFoo b = UnrestrictedFoo (forall a . Foo a b)

【讨论】:

    【解决方案2】:

    您可能正在类型级别寻找undefined 来为类型创建存根。这已经在这里讨论过: Undefined at the type level

    因此,您可以定义自己的数据类型并为其创建您使用的任何类型类的实例。如果您想减少需要实现的实例数量,可以使用一些标准数据类型,例如Void 甚至Proxy ()。后者更好,因为它有更多实例。

    http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Void.html

    http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Proxy.html

    【讨论】:

      【解决方案3】:

      我同意 () 是在这里使用的最佳类型,因为它表明您不关心类型,但是如果您希望它满足您的代码约束,您可以 newtype 它并派生当您需要它们时,需要的实例是微不足道的。

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2019-12-26
        • 1970-01-01
        • 2017-07-24
        相关资源
        最近更新 更多