Joel Reymont wrote:
I have a lot of boilerplate code like this and wonder how I can scrape it.instance Morpher Type C.Type where morph TyInt = return C.TyInt morph TyFloat = return C.TyFloat morph TyStr = return C.TyStr morph TyBool = return C.TyBool morph TyColor = return C.TyColor morph TyStyle = return C.TyStyle morph (TyList ty) = liftM C.TyList (morph ty) morph (TyArray ty) = liftM C.TyArray (morph ty) morph (TySeries ty) = liftM C.TySeries (morph ty) morph (TyInput ty) = liftM C.TyProp (morph ty) morph (TyRef ty) = liftM C.TyRef (morph ty) morph TyUnit = return C.TyUnit morph TyPrintDest = return C.TyPrintDest
One option is to change your data types. I would suggest something like this:
> data Type = TyPrim TyPrim | TyCon TyCon Type > data C.Type = C.TyPrim TyPrim | C.TyCon TyCon C.Type where TyPrim and TyCon (primitves and constructors) can be shared: > data TyPrim = TyInt | TyString | TyFloat | TyBool | etc. > data TyCon = TyList | TyArray | TySeries | TyInput | TyRef Now the class instance can be: > instance Morpher Type C.Type where > morph (TyPrim p) = return (C.TyPrim p) > morph (TyCon c t) = C.TyCon c <$> morph t > -- or liftM for people not so in love with Applicative :) Twan _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
