假设我有一些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
相同,没有任何性能等成本吗?