Тип проверенного разложимого графа в Haskell
Допустим, я создаю конвейер данных, который будет обрабатывать текстовые файлы. У меня есть следующие типы и функции:
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 в значительной степени точен и дает мне большую часть пути, поскольку я могу затем построить график метаданных (имен), используя Map, и проверять его по отдельности одновременно, однако мне также нужен некоторый гибкий полиморфизм. Пример ниже решает это, но с двумя серьезными оговорками:
Я не обязан быть исчерпывающим в сопоставлении с образцом на шаге 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