あなたは、コンストラクタのない代数的データ型を定義することができます(または種類は?)?コンストラクタのない代数データ型の目的は何ですか?コンストラクタを持っていません</p> <pre><code>data Henk </code></pre> <p>しかしタイプの目的です:Haskellでは
答えて
タイプレベルの機械では型が存在することがしばしばありますが、そのような型の値は構成されません。
例えば、ファントムの種類:
module Example (Unchecked, Checked, Stuff()) where
data Unchecked
data Checked
data Stuff c = S Int String Double
check :: Stuff Unchecked -> Maybe (Stuff Checked)
check (S i s d) = if i>43 && ...
then Just (S i s d)
else Nothing
readFile :: Filepath -> IO (Stuff Unchecked)
readFile f = ...
workWithChecked :: Stuff Checked -> Int -> String
workWithChecked stuff i = ...
workWithAny :: Stuff any -> Int -> Stuff any
workWithAny stuff i = ...
限りS
コンストラクタは、モジュールによってエクスポートされていないとして、このライブラリの利用者は、Stuff
データ型のステータスを「確認」を偽造することはできません。
上記のように、workWithChecked
関数は、呼び出されるたびに入力をサニタイズする必要はありません。ユーザは、「チェックされた」タイプの値を提供する必要があるため、すでにそれを完了していなければなりません。これは、ユーザが事前にcheck
関数を呼び出していなければならないことを意味します。これは効率的で堅牢な設計です。コールごとに同じチェックを何度も繰り返すわけではありませんが、チェックされていないデータをユーザーに渡すことはできません。
タイプChecked
,Unchecked
の値が重要でないことに注意してください。決してそれらを使用しません。
コメントの中で言及されている他のものとして、空のタイプの他にも、ファントムタイプ以外の多くの用途があります。たとえば、一部のGADTには空のタイプが含まれます。例えば。
上記では、タイプに長さ情報を記録するために空のタイプを使用しています。さらに、なしのコンストラクタを持つ型は、いくつかの理論的な特性を達成するために必要な
は:私たちはEither a T
がT
に同型であるようなa
を探している場合、我々はa
が空になりたいです。型理論では、空の型は、論理的に「偽」な命題に相当する型として一般に使用されます。
これは、有用である。あなたの例を拡張するには、チェックされているかチェックされていない 'Stuff'や、チェックされたバージョンだけで動作する他の関数でうまく動作するいくつかの関数を持つこともできます。 –
@JeremyList私は完全に同意します(そうでなければ、単にファントムインデックスの代わりに2つの異なるタイプを使用できます)。もう少し改善するためにもう1つの機能を追加しましたが、ファントムタイプのフルパワーはここには表示されません。 – chi
- 1. <script><!--//--></script>には近代的な目的がありますか?
- 2. std :: set <VALUE、std :: owner_less <VALUE>>の目的は何ですか?
- 3. なぜ '<<<'フィルタリングはgdbのnullバイトで、 '<()'はしませんか?
- 4. =、< - 、<=、haskellの違いは何ですか?
- 5. ASP.NET MVCで "<%="、 "<%:" "<%#"の違いは何ですか?
- 6. ハスケル:私は<code>Int</code>は頂点のインデックス番号であると<code>[Vertex]</code>がこの頂点に隣接する頂点であるカスタム再帰的なデータ型</p> <pre><code>data Vertex = Vertex Int [Vertex] </code></pre> <p>を持って再帰的なデータ型
- 7. aspxの<%:と<%=と<%#の違いは何ですか?
- 8. Cの<と<<の違いは何ですか?
- 9. コンストラクタ関数の作成後にプロトタイプを使用する利点は何ですか?あなたは</p> <pre><code>var SomeClass = function(){ this.a= ""; this.b= ""; } </code></pre> <p>のようなコンストラクタ関数を使用している場合
- 10. フレックス<fx:Script>の 'fb:purpose'の目的は何ですか?
- 11. web.xmlの<filter>タグの目的は何ですか?
- 12. Magentoの<payment_action>タグの目的は何ですか?
- 13. <winnt.h>のANYSIZE_ARRAYの目的は何ですか?
- 14. <ext:JsonReader>のReaderID属性の目的は何ですか?
- 15. Android XMLファイルの<! - suppress ALL - >の目的は何ですか?
- 16. param_typeコンストラクタがランダムな分布に対して明示的になるのはなぜですか?</p> <pre><code>int main() { std::random_device engine; std::uniform_int_distribution<size_t> dis; std::cout << dis(engine, {0, 5}) << std::endl; } </code></pre> <p>をしかし、それはエラーメッセージで失敗します:
- 17. <<はPythonで何を表していますか?
- 18. <Out()>属性。有用な目的は何ですか?
- 19. <meta name = "directory" content = "submission">の目的は何ですか?
- 20. <circle> htmlタグの目的は何ですか?
- 21. Functorクラス(<$)の目的は何ですか?
- 22. XML <? ?>トークンの目的は何ですか?
- 23. HandlerExtensions.ConnectHandle ConnectHandler <T>()メソッドの目的は何ですか?
- 24. イベントパラメータkind = "calendar#event"の目的は何ですか? GoogleカレンダーのAPIでのイベントパラメータの目的= "カレンダー#イベント"</p> </blockquote> <p></p> <blockquote> <p>一種である何
- 25. cout << coutとcout <<とcoutの違いは何ですか?
- 26. PostBackUrlの目的<asp:Button>
- 27. Symfony2のサービスコンテナ - 私はこの<code>Paginator</code>クラスのコンストラクタを持っているサービスのコンストラクタ
- 28. << CONSTANTは何をしますか?
- 29. <html:submitタグと<input type = "submit"の具体的な違いは何ですか?
- 30. このコード行は何を意味していますか? $ channel = <<< _ XML_;
これらはファントムタイプと呼ばれます。それらは、他の型をパラメータ化するために、すなわち、タイプコンストラクタに型パラメータとして渡す。その値コンストラクタのどれも、そのファントム型の値パラメータを期待しない。 –
ファントムの種類は気にしないでください(重複していない、Erik)。少なくとも1つの空の種類のための賢明な動機があります:http://stackoverflow.com/q/14131856/828361 – pigworker