Performance 没有约束的GADT(或存在主义)是否可以像非类型化的普通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这样的东西仍然会遍历列表,什么

假设我有一些ADT,比如

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