私はHaskellの新人で、現在Real World Haskellを見ています。本書では、型コンストラクタは型シグネチャでのみ使用され、値コンストラクタは実際のコードで使用されると説明しています。また、両方の名前が互いに独立していることを示す宣言の例を示します。最初の場所に2つのコンストラクタが必要なのはなぜですか?そのうちの1つだけが実際のコードで使用されていますか?実際のコードで型コンストラクタを使用しないので、型コンストラクタはどのような目的を果たしますか?なぜHaskellの型コンストラクタに加えて値コンストラクタがありますか?
答えて
名前が多分誤解を招くかもしれません。 型のコンストラクタは、宣言する型の名前を表します。それらは、値ではなくタイプを構築するため、実際には型の変数をパラメータ化して型のファミリを定義するため、呼び出されます。彼らはC++のテンプレートやJavaのジェネリックのようなものです。 data MyType a b = Constr a b
では、MyTypeは2つのタイプa
とb
を使用して新しいタイプ(MyType a b)
を作成するタイプコンストラクタです。
値コンストラクタは、他の(オブジェクト指向の)言語で "コンストラクタ"と呼ばれる唯一の部分です。その型の値を作成するために必要なためです。したがって、前の例では、値コンストラクタConstr :: a -> b -> MyType a b
を使用した場合、値Constr "abc" 'd' :: MyType [Char] Char
を作成することができます。後者は実行時値でありながら、型と値についての直感を取得する
私は-1を取り除くために私の答えを改善する方法を尋ねてもいいですか?どうしましたか? –
一つの便利な方法は、前者がコンパイル時値であるということです。言い換えると、型コンストラクタは、コンパイル時にプログラムをタイプする唯一の目的のために、Haskell型のセットの値のコンストラクタです。つまり、実行時に型を構築することはできず、コンパイル時に値を構築することもできません。
したがって、タイプ値に基づいて実行時に明示的に分岐することはできません(暗黙的にタイプメーターを使用することもできます)ので、タイプコンストラクターは実行時オブジェクトとして全く役に立たず、多くの場合、完全に欠けています最終的なバイナリ。逆に、値コンストラクタは実行時にその型のセットで値を構築することができるため、コンパイル時オブジェクトとしては全く役に立たない。
この単純なプロパティのため、型コンストラクタと値コンストラクタは明白に名前を共有できます。
これは、緊急の背景から来た人々にとって理解しやすい答えです! –
「オブジェクトが実際に実行される唯一のものならば、なぜクラスとオブジェクトが必要なのですか?
2種類のコンストラクタは異なるジョブを実行します。型コンストラクタは型シグネチャを取ります。値のコンストラクタは実行可能なコードになります。
最も簡単なケースでは、タイプ "コンストラクタ" はの型名です。最も単純なケースでは、型には値コンストラクタが1つしかありません。ですから、
data Point = Point Int Int
のようなもので終わるあなたは「今私に一体何が二回Point
を記述する必要がなぜ?」自分自身に言うかもしれません
しかし、今はそれほど簡単な例を考えてみます。
data Tree x = Leaf x | Branch (Tree x) (Tree x)
ここTree
は型コンストラクタです。あなたは型引数を与え、型を "構築"します。したがって、Tree Int
は1つのタイプ、Tree String
は別のタイプなどです。 (C++のテンプレートやJavaやEiffelのジェネリックと同様)
一方、Leaf
は値コンストラクタです。値を指定すると、1ノードのツリーが作成されます。したがって、Leaf 5
はTree Int
の値、Leaf "banana"
はTree String
の値です。
Branch
の場合も同様です。 2つのツリー値を取り、それらのツリーを子として持つツリーノードを構築します。たとえば、Branch (Leaf 2) (Leaf 7)
はTree Int
の値です。
詳細な説明をありがとう! –
- 1. Haskellコンストラクタ型パターンマッチング
- 2. 値コンストラクタで宣言された型がHaskell型でないのはなぜですか?
- 3. Haskellの型コンストラクタとjavaジェネリック型の違いは何ですか?
- 4. Java:Objectクラスにコンストラクタがありますか?
- 5. Javaコンストラクタにバグがありますか?
- 6. Scalaコンストラクタにローカルの値/変数がありますか?
- 7. Haskell型のコンストラクタでパラメータの型を定義する方法は?
- 8. なぜGeneratorFunctionコンストラクタのインスタンスの型が '関数'ですか?
- 9. なぜエンティティに空のコンストラクタを宣言する必要がありますか?
- 10. なぜAndroidのandroid.graphics.Colorにpublicコンストラクタがあるのですか?
- 11. フラグメントにデフォルトのコンストラクタがあるのはなぜですか?
- 12. なぜstd :: functionインスタンスにデフォルトのコンストラクタがあるのですか?
- 13. reverse_iteratorにデフォルトのコンストラクタがあるのはなぜですか?
- 14. 戻り値の型がない場合、コンストラクタはオブジェクトに割り当てられていますか?
- 15. クラスにコンストラクタがない場合がありますか?
- 16. Haskellにインストールされているパッケージから型コンストラクタをインポートできません
- 17. なぜ複数のコンストラクタを使用する必要がありますか?
- 18. 複数の可能な型コンストラクタがある間にデータ型の特定のコンストラクタを使用する方法
- 19. コンストラクタの外にあるコンストラクタの値にアクセスする方法
- 20. Scala:定義された型のコンストラクタに共分散がありますか?
- 21. 'any'型はコンストラクタ関数型ではありません。クラスgoogle.maps.OverlayView
- 22. デフォルトのコンストラクタが値型に対して表示されないのはなぜですか?
- 23. C++は、クラスのコンストラクタは、int型の戻り値の型
- 24. コンストラクタのスラッシュを前に返す戻り値の型
- 25. 別のクラスの別のコンストラクタのデフォルトのコンストラクタ値を割り当てます
- 26. C#CodeProviderエラー:コンストラクタが型に見つかりません
- 27. C++利用可能なデフォルトのコンストラクタはありませんが、コンストラクタは指定していませんか?
- 28. モナドの型コンストラクタとリターン関数の相違点(Haskell)
- 29. デフォルトのコンストラクタはありませんか?
- 30. コンストラクタの関数がコンストラクタの関数が完了しなくなるまでコンストラクタの後のコンポーネントのライフサイクルを保持する方法はありますか?
「実際のコード」というフレーズは、プログラムで型コンストラクタを使用しないことを意味するため、残念です。作成者が実際に型のコンストラクタが型の注釈にのみ使用されることを意味していたからです。これは、実際のコードでは使用しないため、Cでキーワード "int"や "long"を必要としないということに相当します(実際のコードとしてカウントされない宣言でのみ使用されます) ")。 –
...受け入れませんか? :) –