Geben Sie in Haskell einen überprüften zerlegbaren Graphen ein

Angenommen, ich erstelle eine Datenpipeline, die Textdateien verarbeitet. Ich habe folgende Typen und Funktionen:

data A = A deriving (Show, Typeable)
data B = B deriving (Show, Typeable)
data C = C deriving (Show, Typeable)
data D = D deriving (Show, Typeable)

step1 :: A -> B
step2 :: B -> C
step3 :: C -> D

Für jeden der folgenden Funktionsschritte {1..3} möchte ich in der Lage sein, aus einer vorhandenen Datei eine neue Datei zu erstellen.

interact (lines . map (show . step . read) . unlines)

Ich möchte sie dann in einem Diagramm anordnen können (Funktionen können also mehrere Eingaben haben), um Folgendes zu erreichen:

Ich kann die Datenstruktur durchlaufen, um festzustellen, welche Funktionen welchen anderen Eingaben bereitstellen

Die Datenstruktur wird zur Kompilierungszeit auf Typüberprüfung überprüft, so dass eine ungültige Anordnung einen Typfehler auslöst.

Ich weiß, wie man 1 ohne 2 macht (gebe ihnen eine gemeinsame Typenklasse), und ich weiß, wie man 2 ohne 1 macht (benutze nur (.)), Aber ich bin nicht sicher, wie man beide auf einmal macht. Irgendwelche Ideen? TIA.

Aktualisieren

Die Antwort von AndrewC ist ziemlich genau und bringt mich zum größten Teil dorthin, da ich dann das Diagramm der Metadaten (Namen) mithilfe einer Karte erstellen und gleichzeitig separat überprüfen kann, aber ich brauche auch einen flexiblen Polymorphismus. Das folgende Beispiel behebt dieses Problem, jedoch mit zwei schwerwiegenden Einschränkungen:

Ich bin nicht gezwungen, bei der Mustererkennung in Schritt 4 vollständig zu sein.Es ist langweilig; Es könnte Dutzende dieser polymorphen Typen im "BorC" -Stil geben, die nichts anderes tun, als Polymorphismus zu ermöglichen, und die nicht einmal sehr sicher sind (siehe 1). Ich habe versucht, Übereinstimmungen mit Mitgliedern einer Typklasse zu kopieren (Step4Input mit Instanzen fürB undC) aber das hat nicht funktioniert (hieß esCouldn't match type B with C).
data BorC = ItsB B | ItsC C

step4 :: BorC -> D
step4 x = case x of { ItsB b -> D; ItsC c -> D }

-- step1    step2
--    \       /
--   ItsB   ItsC
--     \   /
--     step4

Antworten auf die Frage(1)

Ihre Antwort auf die Frage