|
TH, tuples and "impossible happened" problem: msg#00113lang.haskell.glasgow.bugs
Hi, I have a little problem with Template Haskell. I have been trying make a template function that would allow me to read any element of tuple without explicit knowledge of how wide the tuple is. I have done some code but recently I have been stopped by GHC's "impossible happened": Compiler output: Chasing modules from: MyTHUse.hs Compiling MyTH ( ./MyTH.hs, ./MyTH.o ) Compiling Main ( MyTHUse.hs, MyTHUse.o ) Loading package base-1.0 ... linking ... done. Loading package haskell98-1.0 ... linking ... done. Loading package template-haskell-1.0 ... linking ... done. ghc: panic! (the `impossible' happened, GHC version 6.4.1): tyThingDataCon Type constructor `DataziTuple.Z3T{(w) tc 49}' Please report it as a compiler bug to glasgow-haskell-bugs@xxxxxxxxxxx, or http://sourceforge.net/projects/ghc/. -------------------------------------------------------------------------- MyTH.hs: module MyTH where import Language.Haskell.TH import Language.Haskell.TH.Syntax import Language.Haskell.TH.Ppr -- TI data_constructor param_count data TupleInfo = TI Name Int -- getTupleInfo :: Name -> Q TupleInfo getTupleInfo var_name = do info <- reify var_name case info of vi@(VarI _ typ _ _) -> case typ of appt@(AppT _ _) -> return $ traverseAppT 0 appt _ -> error "Not a tuple-like type." _ -> error "Not a variable." where traverseAppT n (AppT t1 _) = traverseAppT (n+1) t1 traverseAppT n (ConT name) = TI name (n+1) -- tupleGet :: Name -> Int -> Q Exp tupleGet var_name tuple_index = do (TI constr_name width) <- getTupleInfo var_name param_name <- newName "tuple_elem_" sub_patterns <- genPattern 1 width tuple_index param_name lambda <- lamE [conP constr_name (map return sub_patterns)] (varE param_name) return lambda where genPattern counter n param_index param_name | counter == (n+1) = return [] | counter == param_index = do p <- varP param_name rest <- genPattern (counter+1) n param_index param_name return (p:rest) | otherwise = do wp <- wildP rest <- genPattern (counter+1) n param_index param_name return (wp:rest) ------------------------------------------------------------------ MyTHUse.hs: import MyTH import System.IO import Language.Haskell.TH import Language.Haskell.TH.Syntax import Data.Tuple x = (1,2,3) get1Of3 = $(tupleGet 'x 1) -- Vaclav Haisman
Glasgow-haskell-bugs mailing list Glasgow-haskell-bugs@xxxxxxxxxxx http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
|
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | Re: [GHC] #667: Efficient Map <-> Set conversions, GHC |
|---|---|
| Next by Date: | Re: [GHC] #408: OpenAL needs -pthread, GHC |
| Previous by Thread: | Re: [GHC] #667: Efficient Map <-> Set conversions, GHC |
| Next by Thread: | Re: [GHC] #408: OpenAL needs -pthread, GHC |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |