Вложенные типы данных в 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 могут быть реализованы с точки зрения этих частей.

Другие вопросы по тегам