Ich möchte eine Reihe von Tests in einem einfachen Demo-Programm definieren, wo jeder Test lokal definiert ist, aber alle können an einem Standardplatz gedruckt werden.Wie spezifiziert man einen Typ mit Einschränkungen?
Zum Beispiel;
t1 = ("Sqrt(4)", sqrt(4.0))
...
t2 = ("sumList:", sum [1,2,3,4])
...
t3 = ("Description", value)
...
Also jeder Test ist vom Typ: (String, value), für verschiedene Werttypen von denen alle (nur) haben Mitglieder der anzeigen Klasse.
Dann für die Zusammenfassung der Tests, eine Schleife:
test (msg, val) = do print $ msg ++ " :: " ++ show val
tests ts = mapM test ts
Dies kompiliert, und ordnet diese Typen:
test :: Show a => ([Char], a) -> IO()
tests :: (Traversable t, Show a) => t ([Char], a) -> IO (t())
, die nur so lange, wie alle Tests haben die gleiche Art arbeitet für das zweite Argument. Ich nehme an, dass es den Typ irgendwie auf den tatsächlich angetroffenen Typ der Argumente spezialisiert hat, obwohl sie alle anzeigbar sind.
so dass sie auf den tatsächlichen Arten des zweiten Arguments variieren können, habe ich versucht, so etwas wie dieser (Pseudocode):
type ATest = (Show a) => (String, a)
denn das würde nicht funktionieren, habe ich versucht:
{-# LANGUAGE RankNTypes #-}
type ATest = forall a. (Show a) => (String, a)
Welche kompiliert, aber immer noch bei jeder Variation im Wert Argument fehlschlägt.
Des Weiteren möchte ich abstrakt, um die Art der Tests aus der Schleife, die sie druckt, aber ich kann nicht dann verwenden, konvertieren von:
test :: Show a => ([Char], a) -> IO()
to
test :: ATest -> IO()
Die Grundidee einer polymorphen Typ zu definieren und zu verwenden, war für die Tests in der Definition der Testschleife. Also vielleicht eine Datenstruktur stattdessen;
data (Show a) => ATest = Test (String,a)
aber das scheitert auch, obwohl es die richtige Idee gibt; Alle Tests haben eine gemeinsame Struktur mit einem zweiten Wert in der Typklasse anzeigen.
Was ist der richtige Ansatz dafür?
Ich änderte den Titel in etwas, das das Thema ein wenig deutlicher widerspiegelt, aber ich bin nicht wirklich zufrieden mit meinem Vorschlag. Wenn jemand bessere Ideen hat, bitte bearbeiten Sie es. – duplode