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.
Was ich versucht habe, war das, aber es funktioniert nicht.
%Vor%Meine Frage ist: Wie beschränke ich die Anzahl der Tupel auf 5?
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
und fügt richtige Traversable
, Foldable
, Functor
, Applicative
und Monad
Instanzen hinzu.
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
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.
Tags und Links haskell