假设我有一些 ADT,比如
data Foo = Foo !Int
| Bar (Int->Int) Foo
现在说我想强加某种额外的类型安全,摆脱“幻数类型”:
{-# 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
由于b
只是构造函数中的一个幻像参数,没有约束或其他任何东西,因此它基本上没有意义——除了类型检查器。因此,它可以编译成与 相同的Foo
,而没有任何性能等成本吗?