Вложенные типы данных в postgresql-simple
Рассмотрим следующий код, который может найти некоторый набор координат:
data Coord = Coord { lat :: Float
, lon :: Float
}
instance FromRow Coord where
fromRow = Coord
<$> field
<*> field
findSomePoints :: Connection -> Int -> IO [Coord]
findSomePoints = undefined
Затем я хотел бы определить тип данных для именованного набора координат:
data Path = Path { name :: String
, points :: [Coord]
}
instance FromRow Path where
fromRow = Path
<$> field
<*> -- PROBLEM: would like to call something like `findSomePoints conn field` here...
findPath :: Connection -> Int -> IO Path
findPath = undefined
К сожалению, я не знаю, как составлять типы данных с запросами (в моем случае Path
с Coord
). Возможно ли что-то подобное (и как?).
1 ответ
Решение
Я бы написал тип данных и FromRow
экземпляр для каждой таблицы в базе данных и отделить код базы данных от кода изменяющейся схемы. PathRow
а также [Coord]
вещи, которые вы можете получить непосредственно из БД. makePath :: PathRow -> [Coord] -> Path
, чтобы построить нужную вложенную структуру, вообще не нужно взаимодействовать с базой данных. затем findPath
могут быть реализованы с точки зрения этих частей.