Тип проверенного разложимого графа в 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