Тип проверенного разложимого графа в Haskell

Позволять'скажи яm создает конвейер данных, который будет обрабатывать текстовые файлы. У меня есть следующие типы и функции:

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

Для каждого шага функций {1..3} ниже я хотел бы иметь возможность создать новый файл из существующего файла, выполнив что-то вроде:

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

Затем я хочу иметь возможность упорядочить их в граф (чтобы функции могли иметь несколько входов) для достижения следующего:

Я могу проследить структуру данных, чтобы сказать, какие функции обеспечивают входные данные для других

Структура данных будет проверять тип во время компиляции, так что любое неправильное расположение приводит к ошибке типа.

Я знаю, как сделать 1 без 2 (дать им общий класс типов), и я знаю, как сделать 2 без 1 (просто использовать (.)), Но я 'Я не уверен, как сделать оба сразу. Есть идеи? ТИА.

Обновить

AndrewC»Ответ s в значительной степени точен и дает мне большую часть пути, так как я могу затем построить график метаданных (имен), используя Map, и проверять его по отдельности одновременно, однако мне также нужен некоторый гибкий полиморфизм. Пример ниже решает это, но с двумя серьезными оговорками: I '

Я не обязан быть исчерпывающим в сопоставлении с образцом на шаге 4.Это'утомительно; там могут быть десятки такихBorC» стиль полиморфных типов, которые не делают ничего, кроме включения полиморфизма, и даже не очень безопасно (см. 1). Я попытался сопоставить шаблон с членами класса типа (Step4Input с примерами дляB а такжеC) но это нет работа (сказаноCouldn'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

Ответы на вопрос(1)

Ваш ответ на вопрос