newtype についての私の理解では、それらは GHC によってコンパイルされます。ただし、ファントム型は情報を保持できるため、これがすべてではありません。
ここから:
[a type] を newtype でラップすると、型チェッカーとは異なるものと見なされますが、実行時には同一と見なされます。その後、ファントム型や再帰型などのあらゆる種類の深いトリックを、理由もなく GHC がバイトのバケツをシャッフルすることを心配することなく使用できます。
たとえば、q を法とする算術演算を表す newtype を想像してください。
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 はどのような意味でコンパイルされ、ファントム型情報はどこに保存されるのでしょうか?