あなたは、コンストラクタのない代数的データ型を定義することができます(または種類は?)?コンストラクタのない代数データ型の目的は何ですか?コンストラクタを持っていません</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. ASP.NET MVCで "<%="、 "<%:" "<%#"の違いは何ですか?
- 4. aspxの<%:と<%=と<%#の違いは何ですか?
- 5. 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>をしかし、それはエラーメッセージで失敗します:
- 6. <winnt.h>のANYSIZE_ARRAYの目的は何ですか?
- 7. フレックス<fx:Script>の 'fb:purpose'の目的は何ですか?
- 8. <ext:JsonReader>のReaderID属性の目的は何ですか?
- 9. web.xmlの<filter>タグの目的は何ですか?
- 10. <<はPythonで何を表していますか?
- 11. <Out()>属性。有用な目的は何ですか?
- 12. XML <? ?>トークンの目的は何ですか?
- 13. Functorクラス(<$)の目的は何ですか?
- 14. <meta name = "directory" content = "submission">の目的は何ですか?
- 15. cout << coutとcout <<とcoutの違いは何ですか?
- 16. Symfony2のサービスコンテナ - 私はこの<code>Paginator</code>クラスのコンストラクタを持っているサービスのコンストラクタ
- 17. ではなく、スクリプトの</p> <p>目的(入力ボックス "にタイプ「BYE」)は、すべての偽
- 18. << CONSTANTは何をしますか?
- 19. <html:submitタグと<input type = "submit"の具体的な違いは何ですか?
- 20. 「<%:」は何をしますか?</p> <pre><code><%: Model.FirstName %> </code></pre> <p>「<%:」何をん:行う
- 21. THREE.Camera.prototype.lookAt</ <() -</ <はどういう意味ですか?
- 22. 親子テーブルからのheraricalデータの取得</p> <p><strong>productCategory</strong> それは基本的なカテゴリのデータを持っている:
- 23. なぜ=演算子は値1以外のROWNUMで動作しませんか?レコードが、私は確信してABCテーブルに25件の以上のレコードを持って、私の目的は、n番目のレコードを表示することです</p> <p>を表示しないように:</p> <pre><code>select * from abc where rownum = 10 </code></pre> <p><strong>出力</strong>:
- 24. 一気私は<code>gulp-markdown-to-json</code>と私の目的は、このようになります値下げファイルからデータを取得している<code>gulp-jade</code></p> <p>を使用してい
- 25. ベクトル、行列、および配列データ型の違いは何ですか? <code>vector</code>、<code>matrix</code>と<code>array</code>:
- 26. C#の - 私は3つの方法</p> <ol> <li>を持つクラスを持っている公共DoSth</li> <li>プライベートDoItForReal</li> <li>プライベートDoSthExtra</li> </ol> <p>ユーザーは、(2つのコンストラクタのいずれかを呼び出すことができます
- 27. 目的C <->モノブリッジ
- 28. "<<<"演算子の名前は何ですか?
- 29. 1 << 0とは何ですか?
- 30. PHPで "<<< SQL"とは何ですか?
これらはファントムタイプと呼ばれます。それらは、他の型をパラメータ化するために、すなわち、タイプコンストラクタに型パラメータとして渡す。その値コンストラクタのどれも、そのファントム型の値パラメータを期待しない。 –
ファントムの種類は気にしないでください(重複していない、Erik)。少なくとも1つの空の種類のための賢明な動機があります:http://stackoverflow.com/q/14131856/828361 – pigworker