2017-08-21 13 views
3

データ型の作成中に少し問題があります。Haskell:データ型の複数宣言

私は2つのデータ型、サッカーやテニス

data Football a = Football 
    { players  :: Players a  
    , Stadium  :: Stadium a 
    }  

data Tennis a = Tennis 
    { players1  :: Players a  
    , Stadium1  :: Stadium a 
    } 

を持っていると私は data Sport a = Football a | Tennis a コンストラクタとしてデータ型のサッカーやテニスを使用して他のデータ型のスポーツを作成したいと、私は次のエラーを取得する、複数の宣言私が間違っていることを理解していない。

敬具

+3

あなたはコンストラクタ 'Football :: Players a - >スタジアムa - > Football a'を作ったので、今度は追加のコンストラクタ 'Football :: Sport'を作成しました。 –

+1

また、レコードフィールド名は小文字でなければならないことに注意してください。 'Stadium'はフィールドにすることはできません。 – chi

+0

私はSport a = Football aを追加して私の間違いを訂正します。テニスはまだ問題が続く – Babas

答えて

8

あなたのアイデアが精神で正しいですが、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] 

それはUntaggedListsAnotherUntaggedListsが同じ型であることは事実です:その後、我々は他の同様の定義があると?

これらは疑問の答えではありませんが、タグを使用するかどうかには大きな違いがあります。

+0

ありがとう、私の友人!美しい答え:) – Babas

関連する問題