Beschränken der Anzahl der Elemente, die ein Datenkonstruktor haben kann

8

Ich schreibe eine ADT in Haskell, die eine Kartenhand darstellt. Mein Problem ist, dass ich die Anzahl von (Suit,Face) , die eine Karte darstellt, auf 5 beschränken möchte, die eine Hand darstellt.

%Vor%

Was ich versucht habe, war das, aber es funktioniert nicht.

%Vor%

Meine Frage ist: Wie beschränke ich die Anzahl der Tupel auf 5?

    
user1850254 27.01.2013, 12:43
quelle

3 Antworten

14

Ich möchte hinzufügen, dass Sie, wenn Sie eine Lösung verwenden, die auf 5-Tupeln basiert (wie in den anderen Antworten vorgeschlagen), immer noch alle Funktionen zum Falten / Versetzen haben, die Sie benötigen. Definieren Sie insbesondere zuerst

%Vor%

und definieren falten und traversing Operationen darauf:

%Vor%

Dann können Sie

haben %Vor%

und falten / durchqueren Sie die Struktur mit beliebigen Methoden aus Foldable / Traversable / Functor .

Update: Vor kurzem habe ich eine kleine Bibliothek erstellt tuples-homoghnous-h98 Das definiert newtype Aliase für homogene Tupel wie

%Vor%

und fügt richtige Traversable , Foldable , Functor , Applicative und Monad Instanzen hinzu.

    
Petr Pudlák 27.01.2013, 14:05
quelle
5

Sie können einen Typ für Karten und einen Handtyp mit fünf Kartenelementen erstellen:

%Vor%     
Lee 27.01.2013 13:02
quelle
5

Wie wäre es mit

? %Vor%

?

Oder, wenn Sie wirklich eine Liste verwenden möchten (ich meine, wenn Sie Hände mit 15 Karten wollten, wird mein Vorschlag sehr albern), können Sie data Card = Hand [(Suit, Face)] beibehalten und den Benutzern dann nicht Verwenden Sie den Konstruktor, und stellen Sie stattdessen einen "intelligenten Konstruktor" wie

bereit %Vor%

Sie könnten dann auch den Konstruktor selbst mit einer Warnung wie "nur verwenden, wenn Sie garantieren, dass die gelieferte Liste genau 5 Elemente enthält" verfügbar machen.

Übrigens: Benennt man den Datentyp Card und den Konstruktor Hand nicht ein wenig kontraintuitiv? Ich denke der Datentyp sollte in deinem Fall Hand heißen. Card ist ein schöner Alias ​​für ein Suit - Face -Paar, also könntest du type Card = (Suit, Face) und data Hand = Hand [Card] machen.

    
gspr 27.01.2013 13:02
quelle

Tags und Links