Hello, I am messing around with HDBC and servant. I am implementing a “/users” api endpoint that simply returns a list of users.
data User = User
{ username :: String
, firstName :: String
, email :: String
, password :: String
} deriving (Eq, Show, Generic)
instance ToJSON User
type UsersRoute = "users" :> Get '[JSON] [User]
fromSqlRowToUser :: [SqlValue] -> User
fromSqlRowToUser row = User username firstname email password
where
extractedRow = map fromSql row
username = extractedRow !! 0
firstname = extractedRow !! 1
email = extractedRow !! 2
password = extractedRow !! 3
-- routers handles
usersHandle :: PostgresConnection -> [User]
usersHandle conn = do
select <- prepare conn "SELECT * FROM users;"
_ <- execute select []
result <- fetchAllRows select
return $ map fromSqlRowToUser result
I get this error shown below. Expected [User], but got [[User]]. This is strange and I cannot explain why this error appears.
• Couldn't match type ‘[User]’ with ‘User’
Expected: [User]
Actual: [[User]]
• In a stmt of a 'do' block: return $ map fromSqlRowToUser result
In the expression:
do select <- prepare conn "SELECT * FROM users;"
_ <- execute select []
result <- fetchAllRows select
return $ map fromSqlRowToUser result
In an equation for ‘usersHandle’:
usersHandle conn
= do select <- prepare conn "SELECT * FROM users;"
_ <- execute select []
result <- fetchAllRows select
....
|
97 | return $ map fromSqlRowToUser result