|
From: Justin B. <jgb...@gm...> - 2008-07-31 22:25:17
|
I have run into a problem several times where I have a column that is
defined as Expr BStr10 (or similar) and I want to convert it to a
string column, i.e. Expr String. I came up with a class declaration
and some instances that can do it, but is there a simpler way? I have
(which must be defined in Query.hs since it uses the Expr
constructor):
class BStrToStr s d where
toStr :: s -> d
instance (Size n) => BStrToStr (Expr (BoundedString n)) (Expr String) where
toStr (Expr e) = Expr e
instance (Size n) => BStrToStr (Expr (Maybe (BoundedString n))) (Expr
(Maybe String)) where
toStr (Expr m) = Expr m
This toy example shows the class in action. "query" will compile fine,
but "queryX" will not (when uncommented). Any suggestions are welcome!
Justin
\begin{code}
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
import Database.HaskellDB
import Database.HaskellDB.DBLayout
import Database.HaskellDB.Query (Expr(..))
import Database.HaskellDB.BoundedList (Size)
query = do
t <- table someTable
project $ strField << (toStr (t ! bstrField) :: Expr String)
-- Below does not compile.
--
queryX = do
t <- table someTable
project $ strField << t ! bstrField
class BStrToStr s d where
toStr :: s -> d
instance (Size n) => BStrToStr (Expr (BoundedString n)) (Expr String) where
toStr (Expr e) = Expr e
instance (Size n) => BStrToStr (Expr (Maybe (BoundedString n))) (Expr
(Maybe String)) where
toStr (Expr m) = Expr m
type SomeTable = (RecCons StrField (Expr String)
(RecCons BStrField (Expr BStr10) RecNil))
someTable :: Table SomeTable
someTable = baseTable "someTable" $
hdbMakeEntry StrField #
hdbMakeEntry BStrField
data StrField = StrField
instance FieldTag StrField where
fieldName _ = "strField"
strField :: Attr StrField String
strField = mkAttr StrField
data BStrField = BStrField
instance FieldTag BStrField where
fieldName _ = "bstrField"
bstrField :: Attr BStrField BStr10
bstrField = mkAttr BStrField
\end{code}
|