1. ホーム
  2. haskell

[解決済み] Haskellにはなぜ "data "と "newtype "があるのですか?重複] [重複] [重複

2022-04-26 10:10:26

質問

のようです。 newtype の定義は、単に data の定義は、いくつかの制約(たとえば、コンストラクタはひとつだけ)に従っており、この制約のためにランタイムシステムが newtype の方が効率的です。また、未定義の値に対するパターンマッチングの扱いが若干異なります。

しかし、Haskellが data の定義はなく newtype あるデータ定義がこれらの制約に従うかどうかをコンパイラが自分で調べて、自動的にもっと効率的に処理することはできないのでしょうか?

何か見落としている、深い理由があるに違いない。

解決方法は?

両方 newtype とシングルコンストラクタの data は1つの値コンストラクタを導入していますが newtype は strict であり data は遅延です。 ですから、もし

data D = D Int
newtype N = N Int

次に N undefined は、次のように等価です。 undefined となり、評価されるとエラーになります。 しかし D undefined ではない と同じです。 undefined であり、中を覗こうとしない限りは評価できる。

<ブロッククオート

コンパイラが勝手に処理できないか。

これは、プログラマがコンストラクタをstrictにするかlazyにするかを決定するケースです。 コンストラクタをいつ、どのように厳格化するか、あるいは遅延させるかを理解するには、私よりもずっと遅延評価について理解している必要があります。 私はこの報告書にある考え、つまり newtype は、既存の型の名前を変更するために存在するものです。

newtype Feet = Feet Double
newtype Cm   = Cm   Double

と同じように動作します。 Double しかし、コンパイラはこの2つを混同させないことを約束しています。