2

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 はどのような意味でコンパイルされ、ファントム型情報はどこに保存されるのでしょうか?

4

2 に答える 2

14

心に留めておくべきことは、Haskell に「コンパイル」しないことです。他のより明示的な言語にコンパイルします.GHCの場合、次のよく知られたステップダウンはコアです. また、CoreaddZqの型にコンパイルすることはできませんが、 として記述できる型にコンパイルすることはできます。このより明示的な言語では、Haskell とは異なる意味を持ちます。この言語では、 はクレームの証拠 (この場合はクラス ディクショナリ) を取得し、 type の何かを生成する関数の型です。Soは とほぼ同じで、確かに Haskell でもその型を与えることができます。Int -> Int -> IntModulus q => Int -> Int -> Int=>c => tctModulus q => Int -> Int -> Int(q -> Int) -> Int -> Int -> IntaddZq

于 2013-11-08T16:36:50.330 に答える
4

newtypes が GHC によってコンパイルされると言われている場合、これは実行時の動作のみを意味します。具体的には、. を使用しない同じコードよりも遅くならないことが保証されていますnewtype。ただし、それらは、ファントム型として使用される場合を含め、コンパイル プロセス全体で型情報を保持します。

つまり、newtype はコンパイル時の情報のみであり、ファントム型が機能するには十分です。

于 2013-11-08T16:22:14.693 に答える