我对新类型的理解是它们是由 GHC 编译出来的。然而,这不可能是全部,因为幻像类型可以保存信息。
从这里:
您可以将 [a type] 包装在 newtype 中,它将被认为与类型检查器不同,但在运行时相同。然后,您可以使用各种深层技巧,例如幻像或递归类型,而不必担心 GHC 会无缘无故地对字节桶进行洗牌。
例如,想象一个表示算术模 q 的新类型:
newtype Zq q = Zq Int
class Modulus q where
getModulus :: q -> Int
addZq :: (Modulus q) => Zq q -> Zq q -> Zq q
addZq (Zq a) (Zq b) = Zq $ (a+b) `mod` (getModulus (undefined :: q))
addZq
不能编译成
addZq :: Int -> Int -> Int
那么 newtype 是在什么意义上编译出来的,幻像类型信息存储在哪里呢?