あなたのアイデアが精神で正しいですが、Haskellはタグ付けされた組合(とも呼ばれる「判別組合」、「ばらばら組合」、「変異体」、および「和タイプ」)を使用しています。これは、SportがFootballで構築されているか、Tennisで構築されているかを判断するために、追加のタグが必要であることを意味します。
data Sport = SportFootball Football | SportTennis Tennis
これらのタグはデータ構築としてHaskellで知られています。つまり、これはコンストラクタSportFootball :: Football -> Sport
とコンストラクタSportTennis :: Tennis -> Sport
を定義します。
ハスケルがこの余分なタグを必要としなかったとしたら、このタイプは何でしょうか?
data UntaggedInt = Int | Int
タグの付いていない組合は、プロパティ(x | x) = x
を持つ必要がありますので、これはと同等でなければなりません:
data TaggedInt = This Int | That Int
、労働組合をタグ付けされています。私たちが定義することができ、タグ付き組合とのに対し
data UntaggedInt = Int
等価記号ではありません。
また、コンストラクタなしで発生する何かを考慮してください。
data UntaggedLists = String | [String]
そして今、我々は表現"hello world"
の種類を見つけることを任務としている:私たちのような定義があるとします。タイプはString
またはUntaggedLists
であるべきですか?
data AnotherUntaggedLists = String | [String]
それはUntaggedLists
とAnotherUntaggedLists
が同じ型であることは事実です:その後、我々は他の同様の定義があると?
これらは疑問の答えではありませんが、タグを使用するかどうかには大きな違いがあります。
あなたはコンストラクタ 'Football :: Players a - >スタジアムa - > Football a'を作ったので、今度は追加のコンストラクタ 'Football :: Sport'を作成しました。 –
また、レコードフィールド名は小文字でなければならないことに注意してください。 'Stadium'はフィールドにすることはできません。 – chi
私はSport a = Football aを追加して私の間違いを訂正します。テニスはまだ問題が続く – Babas