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} |