2017-12-09 1 views
3

Ich versuche, auf einige Daten innerhalb eines Typs von einem importierten Paket zuzugreifen.Haskell: Nth-Wert vom Typ abrufen, der ein Tupel ist

Der Typ wird erklärt (von den Paketautoren) als so:

newtype MultiBalanceReport = 
    MultiBalanceReport ([DateSpan] 
        ,[MultiBalanceReportRow] 
        ,MultiBalanceReportTotals 
        ) 

Und ich versuche, die erste Liste in der Art mit einer Funktion zu extrahieren etwa so:

getDates :: MultiBalanceReport -> [DateSpan] 
getDates (date,_,_) = date 

aber wenn ich die Funktion zu verwenden, beschwert sich der Compiler, dass die Typen nicht gleich sind:

• Couldn't match expected type ‘MultiBalanceReport’ 
       with actual type ‘([DateSpan], t7, t8)’ 

ich wie die Co fühlen mpiler kennt nicht die inneren Details des MultiBalanceReport Typs? Wird das Paket, das den Typ korrekt definiert, nicht importiert?

Ich bin neu bei Haskell, es tut mir so leid, wenn ich die falsche Nomenklatur verwende, um mein Problem zu beschreiben.

+0

Ich würde die Ansicht, dass ein Antipattern sein . Verwenden Sie einfach einen 'data MBR = MBR [DateSpan] [MultiBalanceReportRow] MultiBalanceReportTotals' und vermeiden Sie das Tupling, indem Sie nur den' MBR'-Konstruktor verwenden. – chi

Antwort

4

A newtype ist ein Datentyp mit einem Konstruktor, so müssen Sie unwrap das Tupel aus dem Konstruktor MultiBalanceReport zuerst:

getDates :: MultiBalanceReport -> [DateSpan] 
getDates (MultiBalanceReport (date,_,_)) = date
4

Sie müssen die newtype in Ihrem Muster Spiel

getDates :: MultiBalanceReport -> [DateSpan] 
getDates (MultiBalanceReport (date,_,_)) = date 
3

Sie sind ganz in der Nähe sind. Sie sind Mustervergleich für einen Tupel-Typ, aber der tatsächliche Wert, den Sie haben, ist ein MultiBalanceReport, das ein Tupel enthält.

getDates :: MultiBalanceReport -> [DateSpan] 
getDates (MultiBalanceReport (date,_,_)) = date