假设我有类似的类型:
newtype Foo a b = Foo { getFoo :: SomeStructure b }
即。 a
是一种幻像类型,仅用于编译时检查。
但是,我不想在任何地方使用幻像类型。它在我的代码中并不普遍有用。所以我想做点什么:
type FooUnrestricted b = Foo Anything b
我应该使用什么代替Anything
?我需要一些语言扩展吗?
编辑:我意识到我可以简单地使用()
,它会回答我的问题。但实际的一点是,我的函数会对a
施加约束,我希望它们始终得到满足。
答案 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
它可以在您需要时轻松获得所需的实例。