[解決済み】Haskell の `data` と `newtype` の違いについて
質問
このように書くと何が違うのでしょうか?
data Book = Book Int Int
対
newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid
解決方法は?
いい質問ですね。
いくつかの重要な違いがあります。
表現方法
-
A
newtype
は、ラップした型と全く同じ表現を実行時に持つことを保証します。 -
一方
data
は、実行時に全く新しいデータ構造を宣言します。
つまり、ここでの重要なポイントは
newtype
は、コンパイル時に消去されることが保証されています。
例
-
data Book = Book Int Int
-
newtype Book = Book (Int, Int)
と全く同じ表現をしていることに注意してください。
(Int,Int)
というのは
Book
のコンストラクタは消去されます。
-
data Book = Book (Int, Int)
を追加しています。
Book
には存在しないコンストラクタです。
newtype
.
-
data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int
ポインターがない!?2つの
Int
フィールドは、ボックス化されていないワードサイズのフィールドで
Book
コンストラクタを使用します。
代数的なデータ型
このようにコンストラクタを消去する必要があるため
newtype
でデータ型をラップするときのみ機能します。
単一のコンストラクタ
. 代数的な新型の概念はありません.つまり,例えば,次のようなものに相当する新しい型を書くことはできません.
data Maybe a = Nothing
| Just a
は複数のコンストラクタを持っているからです。また
newtype Book = Book Int Int
厳密性
コンストラクタが消去されることで、以下のように非常に微妙な厳密性の違いが生じます。
data
と
newtype
. 特に
data
つまり、本質的に、底値に評価する方法が追加されているのです。には実行時に追加のコンストラクタはありません。
newtype
という性質があるため、この性質は成り立ちません。
の余分なポインタは
Book
から
(,)
のコンストラクタで底値を入れることができます。
その結果
newtype
と
data
のように、厳密性のプロパティが若干異なります。
は、Haskell wiki の記事
.
アンボックス
のコンポーネントをアンボックス化することは意味がありません。
newtype
コンストラクタがないためです。と書くのは全く合理的ですが
data T = T {-# UNPACK #-}!Int
を持つランタイムオブジェクトを生成します。
T
コンストラクタと
Int#
コンポーネントを使用します。あなたはただ、素の
Int
と
newtype
.
参考文献 :
- Haskell wiki の "Newtype"を参照してください。
- ノーマン・ラムゼイ氏の回答 ストリクトネス・プロパティについて
関連
-
[解決済み] C#のbool型とBoolean型の違いとは?
-
[解決済み] Haskellにおける除算
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] Pythonの旧スタイルのクラスと新スタイルのクラスの違いは何ですか?
-
[解決済み] textとvarcharの違い(character varying)
-
[解決済み] .の違いは何ですか?(ドット)と$(ドルマーク)の違いは何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】一般的なHaskellの演算子で発音可能な名前はありますか?[クローズド]
-
[解決済み】Haskell の `data` と `newtype` の違いについて
-
[解決済み】Haskellの入門編
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] haskellでCharからIntに変換する
-
[解決済み] Haskellの[]と':'とは何ですか?
-
[解決済み] Haskellにおける除算
-
[解決済み] HaskellでIntからsqrtを取得する
-
[解決済み】Weak Head Normal Formとは何ですか?
-
[解決済み】Template Haskellの何がそんなに悪いのか?
-
[解決済み】一般的なHaskellの演算子で発音可能な名前はありますか?[クローズド]
-
[解決済み】なぜモナドが必要なのか?
-
[解決済み] Haskellにはなぜ "data "と "newtype "があるのですか?重複] [重複] [重複
-
[解決済み】Haskell/GHCの`forall`キーワードは何をするのですか?