1

考虑以下可以找到一组坐标的代码:

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

不幸的是,我不知道如何用查询组合数据类型(在我的例子PathCoord)。这样的事情是否可能(以及如何?)。

4

1 回答 1

2

我会FromRow为数据库中的每个表编写一个数据类型和一个实例,并将数据库代码与更改模式代码分开。 PathRow并且[Coord]是您可以直接从数据库中获得的东西。 makePath :: PathRow -> [Coord] -> Path,构建你想要的嵌套结构,根本不需要和数据库交互。然后findPath可以根据这些部分来实现。

于 2018-07-18T15:16:18.187 回答