2016-05-15 8 views
1

Ich versuche, diese Arbeit zu bekommen:Wie erstelle ich ein a Vielleicht gleichwertig für Vektoren von Vektoren?

type CharVector = V.Vector Char 
type CharMatrix = V.Vector CharVector 

data MaybeCharMatrix = 
    Nothing 
    | CharMatrix 

Aber ich bin nicht in der Lage, die folgenden Dinge zu tun:

1) Mustervergleich

test :: MaybeCharMatrix -> Int 
test Nothing = -1 -- Doesn't matter, is just to illustrate 
test <something> = ? -- Somehow be able to do: cols <something> * rows 

2) ableiten show instance:

instance Show MaybeCharMatrix where 
    show Nothing = "" 
    show <something> = "Cols: " ++ cols <something> ++ ", Rows: " ++ rows <something> 

Wie kann dies erreicht werden? Gibt es andere effiziente Möglichkeiten, dies zu tun?

+2

'Daten MaybeCharMatrix = Nichts | CharMatrix - hier ist CharMatrix ein Konstrukteur AFAIK, ** nicht ** der Typ, der auch 'CharMatrix' genannt wird. – immibis

Antwort

3

Wie wäre es mit:

type MaybeCharMatrix = Maybe CharMatrix 

test :: MaybeCharMatrix -> Int 
test Nothing = -1 
test (Just matrix) = ... 

Dies Ihnen nicht erlauben, Ihre eigenen benutzerdefinierten Karte Instanz zu erstellen, also hier ist eine weitere Option:

newtype MaybeCharMatrix = MCM (Maybe CharMatrix) 

test :: MaybeCharMatrix -> Int 
test (MCM Nothing) = -1 
test (MCM (Just matrix)) = ...some function of matrix... 

instance Show (MaybeCharMatrix) where 
    show (MCM Nothing) = "the nothing string" 
    show (MCM (Just matrix)) = ... "Cols: " ++ show (cols matrix) ++ ... 

Ich glaube, du bist besser dran, nur mit der type Alias ​​(erste Option). Dann können Sie alle Funktionen verwenden, die direkt auf Maybe-Werte wirken.

show wird am besten für eine Haskell-Darstellung des Werts verwendet, d. H. Es sollte ein gültiger Haskell-Ausdruck sein. Wenn Sie ein benutzerdefiniertes Rendering des Werts wünschen, verwenden Sie einfach einen anderen Namen für die Renderfunktion - z. dumpMatrix.

aktualisieren

basierend auf dem Kommentar etwas wie benötigen:

data MaybeCharMatrix = MyNothing | MyJust CharMatrix 

test :: MaybeCharMatrx -> Int 
test MyNothing = -1 
test (MyJust matrix) = ... can use matrix here ... 

instance Show MaybeCharMatrix where 
    show MyNothing = "my nothing" 
    show (MyJust matrix) = "... Cols: " ++ show (cols matrix) ++ ... 
+0

Es ist meine Schuld. Die Frage ist ein vereinfachter Fall dessen, was ich will. Es war nur ein Beispiel für das Konzept. Ich möchte in der Lage sein, das Konzept hinter der Frage zu implementieren (zu Lernzwecken). Tut mir leid, wenn es nicht klar genug war. – OneEyeQuestion

+0

Antwort aktualisiert. – ErikR

3

Ihr Problem ist mit der Datentypdeklaration. Im Allgemeinen haben Typdeklarationen die Form.

Mit anderen Worten, der erste Ausdruck in jeder Klausel der Datendeklaration wird als Datenkonstruktor genommen. Also, als du deinen Datentyp benutzt hast.

data MaybeCharMatrix = Nothing | CharMatrix 

Haskell behandelt CharMatrix als Daten Konstruktor kein Typ. Ihre Definition von Nothing steht ebenfalls in Konflikt mit der Definition der Standardbibliothek, daher sollten Sie ihren Namen ändern. Was du wirklich willst, ist so etwas.

data MaybeCharMatrix = NothingCM | JustCM CharMatrix 

, dass ein Datum Konstruktor erstellt JustCM, die ein CharMatrix als Argument. Dann können Sie Muster so anpassen.

test :: MaybeCharMatrix -> Int 
test NothingCM = -1 
test (JustCM mat) = <code> 

instance Show MaybeCharMatrix where 
    show NothingCM = "" 
    show (JustCM mat) = "Cols: " ++ cols mat ++ ", Rows: " ++ rows mat 
+0

Würde auch Ihre Antwort akzeptieren, aber der andere Typ antwortete zuerst. Es tut uns leid. – OneEyeQuestion