2017-05-18 3 views
1

Ich werde jetzt die Datentypen verwenden, aber es gibt etwas, was ich gerade von anderen Programmiersprachen weiß. vorstellen, dass „Datum“ gets (Jahr Monat Tag)Datendeklaration - benutze 3 Parameter

wenn ich

data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec 
data Date = Date Int Month Int 

haben und ich möchte eine Funktion haben

showDate :: Date -> String 

wie kann ich die 3. Parameter von der nehmen Datentyp Datum zum Erstellen des Jahres? oder besser zu beschreiben .. wie kann ich eine Zeichenfolge mit den Returns zum Beispiel "Mai 18 2017"

in anderen Sprachen Ich würde schreiben Datum [2] für den 3. Parameter oder das Datum [0] für die 1.

Vielen Dank für Ihre Hilfe!

+0

'showDate (Datum Tag Monat Jahr) = '? – Lazersmoke

Antwort

4

Sie tun pattern matching in Haskell:

data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving (Show) 
data Date = Date Int Month Int 

showData :: Date -> String 
showDate (Date day mon year) = "Date is: " ++ (show day) ++ " " ++ (show mon) ++ " " ++ (show year) 

Bitte beachte, dass ich Show Instanz für Month Typ ableiten oben deriving (Show) verwenden. Stattdessen es automatisch zu tun, können Sie geben Ihre Hand Show Instanzen wie folgt gefertigt:

instance Show Month where 
    show Jan = "January" 
    show Feb = "February" 
    .... and so on 

Demo:

*Main> showDate (Date 3 Feb 2017) 
"Date is: 3 Feb 2017" 

Oder auch so:

data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving (Show) 
data Date = Date Int Month Int deriving (Show) 

Dies wird die automatisch ableiten Zeigt die Instanz Ihres Datentyps an.

*Main> show (Date 3 Feb 2017) 
"Date 3 Feb 2017" 
+0

Ich kenne das PatternMaching, aber ich habe wirklich alles versucht, was ich in Syntax kann! danke, dass du mir geholfen hast! –

+2

Sie sollten Mustererkennung verwenden. Pattern Matching ist kein nachträglicher Einfall in die Sprache, aber es ist Teil des Kerns. – Nykros

+1

@R.Mayer und für den Fall, dass Sie sich wundern, * es gibt keinen anderen Weg *, wenn man die Art und Weise, wie Sie Dinge deklariert haben, betrachtet. Wenn Sie ein Datum mit Datensatzfeldern definiert haben, z. 'data Datum = Datum {Tag :: Int, Monat :: Monat, Jahr :: Int}', dann könnten Sie z. B. Jahrdatum verwenden, um das Jahr zu extrahieren. Aber ohne eine solche Definition ist der Mustervergleich der einzige Weg. – luqui

Verwandte Themen