Я моделирую информацию о типе реляционной базы данных. Я хотел бы построить следующий график:Построение структуры графа в haskell
Вершины являются таблицами.
Ребро существует из таблицы А к таблице Б для каждого столбца в А, который является внешним ключом к В.
Это исходные данные я для построения графика.
newtype TableName = TableName T.Text
newtype ColName = ColName T.Text
newtype ColType = ColType T.Text
type DBInfo = H.HashMap TableName TableInfo
type TableInfo = H.HashMap ColName ColInfo
data ColInfo = CISimple ColType
-- Forms the basis for building the graph
| CIFKey ColType TableName -- col type, referenced table
getDBInfo :: IO (DBInfo)
Это типы структуры графика, которую я ожидаю.
data SafeColInfo = SCISimple ColType
-- This captures an edge between two tables
| SCIFKey ColType SafeTableInfo
type SafeTableInfo = H.HashMap TableName SafeColInfo
type SafeDBInfo = ..
Я хотел бы написать эту функцию:
convDBInfo :: DBInfo -> Either String SafeDBInfo
convDBInfo
должны строить выше график. Информацию о t
по любому иностранному ключу (CIFKey ctype t)
можно найти, просмотрев t
в DBInfo
. Если он не найден, входные данные являются несогласованными и являются ошибкой.
Это довольно прямолинейный язык с обязательными ссылками. Однако я не могу придумать способ решить эту проблему в Haskell. Насколько я понимаю, это похоже на хорошую привязанность к парадигме «Связывание узла», но я не могу обернуться вокруг нее. Как написать эту функцию?
Извините, что должно делать 'convDBInfo'? – Ryan
Жаль, что я не был чист. Отредактировано для добавления информации. – svr
Если вы знаете, что не будет ошибки, зачем нужно возвращать «Либо»? – Ryan