Sie haben den Typ Car a b c
, nicht Car
definiert. Was Sie später verwenden möchten, ist nur Car
, worüber der Compiler Sie warnt (für Sie ein wenig kryptisch) Nachricht Expecting three more arguments to 'Car'
. Es macht eigentlich keinen Sinn, zu erwarten, dass Car
alleine magisch als Typ funktionieren würde, was wären die Felder? Es beginnt erst Sinn zu ergeben, wenn Sie angeben, was a
, b
und c
sind. So Car
kann verwendet werden, um einen Typ zu konstruieren (sagen Car String String String
) und so heißt es Typ Konstruktor. Um zwischen diesen zu unterscheiden und eine Analogie zu den Konstruktionen auf Werteebene zu ziehen, verwendet Haskell Arten ähnlich wie Typen, um einzelne Werte zu gruppieren.
Car
von der Art * -> * -> * -> *
bedeutet, dass es 3 Arten benötigt, um einen konkreten 4. Typ zu erzeugen.
Um den Compiler Magic zu verwenden, um Show
automatisch abzuleiten, müssen Sie sicherstellen, dass die Komponenten auch instanziieren. Ohne dies kann der Compiler nicht erwarten, dass er auf magische Weise einen Weg findet, beliebige Typen in Zeichenketten umzuwandeln (wie Sie es von show
erwarten). Sie können dies mit Einschränkungen erreichen aber soweit ich weiß, können Sie diese nur hinzufügen, wenn eine Spracherweiterung GADTs
{-# LANGUAGE GADTs #-}
data Car a b c where
Car :: (Show a, Show b, Show c)
=> { company :: a, model :: b, year :: c }
-> Car a b c
verwenden, aber man kann immer noch deriving Show
nicht direkt verwenden, da das scheint nur zu arbeiten, wenn der Typ Car a b c
funktioniert für alle a
, b
, c
, was hier nicht der Fall ist. Zumindest nicht mit ghc-7.10
. Was dies tut, ist, dass es nur schlechte Entscheidungen von a
, b
, c
bei der Konstruktion eines Autos verbietet. Ein Beispiel für einen Typ ohne eine Instanz ist der Funktionstyp, und es ist sinnvoll, ihn zu sperren, indem Sie anfordern. Leider müssten Sie
instance (Show a, Show b, Show c) => Show (Car a b c) where
show (Car a b c) = "Car " ++ show a ++ " " ++ show b ++ " " ++ show c
„Ich erhalte diese Fehlermeldung“ Zu Recht hinzuzufügen, da der Code geschrieben macht keinen Sinn. "Es funktioniert, wenn ich die Typparameter wie unten nicht verwende" Auch vollkommen OK, das ist absolut das Richtige zu tun. Also, was ist das Problem? –
Entschuldigung, ich habe das Problem aktualisiert, es funktioniert, wenn ich versuche, Datentypen zu verwenden, aber nicht, wenn ich versuche, Typparameter zu verwenden. – Srinivas
Noch einmal, was ist das Problem? Erwarten Sie, dass "Firma" oder "Modell" etwas anderes als "String" und "Jahr" etwas anderes als "Int" ist? Warum? –