|
RE: TH, tuples and "impossible happened" problem: msg#00035lang.haskell.glasgow.bugs
I'm sorry I've been slow in replying to this. Short summary: your program has a bug, but GHC still should not crash. The bug is that you extracted the Name of the *type constructor* (,,) from the type of 'x, but you then used it as a *data constructor* in the pattern. Solution: when you have the Name of the type constructor, use 'reify' again to get the data constructors. Meanwhile I will make GHC complain more gracefully. Simon | -----Original Message----- | From: glasgow-haskell-bugs-bounces@xxxxxxxxxxx [mailto:glasgow-haskell-bugs- | bounces@xxxxxxxxxxx] On Behalf Of Václav Haisman | Sent: 19 March 2006 16:06 | To: glasgow-haskell-bugs@xxxxxxxxxxx | Subject: TH, tuples and "impossible happened" problem | | 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 |
|
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | [GHC] #745: GHC should recover better from bad type signatures, GHC |
|---|---|
| Next by Date: | RE: Template Haskell, Simon Peyton-Jones |
| Previous by Thread: | [GHC] #745: GHC should recover better from bad type signatures, GHC |
| Next by Thread: | RE: Template Haskell, Simon Peyton-Jones |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |