Performance 没有约束的GADT(或存在主义)是否可以像非类型化的普通ADT一样编译?
假设我有一些ADT,比如Performance 没有约束的GADT(或存在主义)是否可以像非类型化的普通ADT一样编译?,performance,haskell,gadt,existential-type,Performance,Haskell,Gadt,Existential Type,假设我有一些ADT,比如 data Foo = Foo !Int | Bar (Int->Int) Foo 现在,我想实施某种额外的类型安全,摆脱“幻数类型”: 由于b只是构造函数中的一个幻象参数,没有约束或其他任何东西,因此它基本上没有意义——除了类型检查器。因此,它是否可以编译成与Foo相同的格式,而不需要任何性能等成本?您需要查看核心以绝对确定,但一般来说: 与基础类型相比,newtype没有运行时成本。但是像mapgetintey这样的东西仍然会遍历列表,什么
data Foo = Foo !Int
| Bar (Int->Int) Foo
现在,我想实施某种额外的类型安全,摆脱“幻数类型”:
由于
b
只是构造函数中的一个幻象参数,没有约束或其他任何东西,因此它基本上没有意义——除了类型检查器。因此,它是否可以编译成与Foo
相同的格式,而不需要任何性能等成本?您需要查看核心以绝对确定,但一般来说:
- 与基础类型相比,
没有运行时成本。但是像newtype
这样的东西仍然会遍历列表,什么也不做mapgetintey
- 类型和类型参数本身在编译过程中被擦除,因此也应该没有运行时开销——这是静态类型的优点之一。只有在使用类型类时,才能传递运行时值
如果您将自己限制在GHC 7.8中,那么新函数也可以提供帮助。GADTs不应该编译为ADTs+相等约束(
~
)吗?
{-# LANGUAGE GADTs #-}
newtype Intey a = Intey { getIntey :: Int }
data Foo' a where
Foo :: !(Intey a) -> Foo' a
Bar :: (Intey a -> Intey b) -> Foo' a -> Foo' b