删除幻像类型变量

时间:2016-09-24 15:57:19

标签: haskell phantom-types

假设我有类似的类型:

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

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

但是,我不想在任何地方使用幻像类型。它在我的代码中并不普遍有用。所以我想做点什么:

type FooUnrestricted b = Foo Anything b

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

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

3 个答案:

答案 0 :(得分:3)

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

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

在其他一些情况下,使用等级2类型可能是有意义的。

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

答案 1 :(得分:1)

您可能在类型级别寻找[self.view layoutIfNeeded]; 来为类型创建存根。这已经在这里讨论过了: Undefined at the type level

因此,您可以定义自己的数据类型,并为您使用的任何类型类创建实例。如果您希望减少需要实施的实例数量,可以使用某些标准数据类型,例如undefined甚至Void。后者更好,因为它有更多的实例。

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

答案 2 :(得分:1)

我同意()是这里使用的最佳类型,因为它表示您不关心类型,但如果您希望它满足您的代码约束,您可以newtype它可以在您需要时轻松获得所需的实例。