
Hi all, I have below source code, i use Dynamic for `pageBuffer`. In implement of function `pageClone`, after `case pt of`, i need write like this, and this code looks ugly, if `PageTyep` have 100 type, i need write those ugly code 100 times. case pt of TStringBuffer -> pageBufferClone (x :: StringBuffer) TImageBuffer -> pageBufferClone (x :: ImageBuffer) TVideoBuffer -> pageBufferClone (x :: TVideoBuffer) TMixBuffer -> pageBufferClone (x :: TMixBuffer) So have a better solution to avoid write above ugly code? Someone suggestion me use GADTs instead, but i don't know how to write correct GADTs code replace current version, if GADTs is best way, someone can explain it detail? It's better if someone give me demo code. ------------------------------> Source Code start <------------------------------ data PageType = TStringBuffer | TImageBuffer | TVideoBuffer | TMixBuffer deriving (Eq, Show, Read) data Page = Page {pageName :: IORef String ,pageId :: Int ,pageType :: PageType ,pageBuffer :: Dynamic ,pageBox :: VBox } class PageBuffer a where pageBufferClone :: a -> IO (Dynamic, VBox) -- | Page clone interface. pageClone :: Page -> IO Page pageClone page = do -- Get common information for clone page. name <- pageGetName page let id = pageId page pt = pageType page pb = pageBuffer page -- Get clone information for dynamic interface. (pBuffer, pBox) <- case fromDynamic pb of Just x -> case pt of TStringBuffer -> pageBufferClone (x :: StringBuffer) TImageBuffer -> pageBufferClone (x :: ImageBuffer) TVideoBuffer -> pageBufferClone (x :: TVideoBuffer) TMixBuffer -> pageBufferClone (x :: TMixBuffer) Nothing -> pageCloneEmpty -- Return clone page. pageNewInternal name id pt pBuffer pBox ------------------------------> Source Code end <------------------------------ Thanks! -- Andy