【发布时间】:2017-07-21 22:37:15
【问题描述】:
即使没有扩展 ExistentialQuantification,Haskell 也支持一些存在类型,通过类型同构,任何类型类 C,
(forall a. C a => (a -> b)) ~ ((exists a. C a => a) -> b)
所以函数f :: C a => a -> b 需要一个x 类型的exists a. C a 参数。但是 Haskell 不允许将 x 与某些类型的 C 进行模式匹配(以狂野匹配 _ 结束,因为类型类通常是无限的)。
这很奇怪,因为存在类型是广义求和类型。 Haskell 确实支持带有 data 关键字的有限和类型,并允许对它们进行模式匹配。在 C++、Java 和 C# 等语言中,存在类型是接口,它们支持使用 dynamic_cast 或 instanceof 等关键字进行模式匹配。
Haskell 没有为上面的f 等函数实现模式匹配有什么原因吗?
【问题讨论】:
-
如果我理解正确,您希望对类型进行模式匹配。这是不可能的,因为没有运行时类型信息。对于普通的 sum 类型,有关已使用的构造函数的信息会在运行时保留。对于存在主义者来说,什么都没有。如果你想要这样的东西,你可以使用 GADT 作为见证,或者使用
Typeable。 -
@kosmikus 是的,我想对类型进行模式匹配。我知道 GHC 的实施方式是不可能的,我在问为什么 GHC 是这样实施的。您能否举一个使用 GADT 进行模式匹配的无限总和类型的示例?我不清楚该怎么做。
-
为什么要以其他方式实施 GHC?类型上的模式匹配只会导致不好的做法;可用类型的集合是无限的,如果没有包罗万象的案例,您永远无法真正获得全面覆盖;并且在运行时获取类型信息通常会带来很大的性能开销。
-
iso不应该是
(forall a. (C a => a) -> b) ~ ((exists a. C a => a) -> b)吗?
标签: haskell