The issue is that the Haskell's Text type only supports conversions from PostgreSQL's text, char, varchar, and a few other types. So this is why converting to Text first doesn't work. What you really want to do is something like the code that follows. I'll admit that your code is shorter and cleaner; perhaps there is a sensible way to change the FromField interface to make it (or something like it) work. I'm certainly not satisfied with the FromField/FromRow interface yet, but I haven't really worked on ways to improve it further. It'd be nice to develop a corpus of use cases that we want to cover. Best, Leon data X = X Float | Y Float buildX :: B.ByteString -> OK (Float -> X) buildX "x" = pure X buildX "y" = pure Y buildX val = returnError ConversionFailed (ellipsis val) ellipsis :: B.ByteString -> String ellipsis x | B.length x > 25 = take 20 (B.unpack x) ++ "[...]" | otherwise = B.unpack x instance FromField (Float -> X) where fromField f mv | typename f == "x" = case mv of Nothing -> returnError UnexpectedNull "some possibly more informative messgage" Just v -> buildX v | otherwise = returnError TypesIncompatible "some possibly more informative message" instance FromRow X where fromRow = field <*> (field :: RowParser Float) On Sat, Jun 16, 2012 at 3:02 PM, Luke Hoersten <luke@hoersten.org> wrote:
I'm trying to use postgresql enum types to represent Haskell types like in the code snippet below but an receiving the following error:
"Incompatible {errSQLType = "x", errHaskellType = "Text", errMessage = "types incompatible"}"
In other areas of my code (not shown) I'm successfully using Text to convert to and from Postgersql enum types but it doesn't seem to work in the case below. Any ideas what I'm doing wrong?
Thanks, Luke
import Database.PostgreSQL.Simple.FromField (FromField, fromField)import Database.PostgreSQL.Simple.FromRow (FromRow, field, fromRow)import Database.PostgreSQL.Simple.SqlQQ (sql)
data X = X Float | Y Float
buildX :: Text -> Float -> XbuildX "x" = XbuildX "y" = Y
instance FromField (Float -> X) where fromField f v = buildX <$> fromField f v
instance FromRow X where fromRow = field <*> (field :: RowParser Float)
_______________________________________________ database-devel mailing list database-devel@haskell.org http://www.haskell.org/mailman/listinfo/database-devel