[GHC] #2358: Template Haskell's TupleT considers unary tuples as a
valid types.
GHC
trac at galois.com
Fri Jun 13 17:40:24 EDT 2008
#2358: Template Haskell's TupleT considers unary tuples as a valid types.
------------------------+---------------------------------------------------
Reporter: fons | Owner:
Type: bug | Status: new
Priority: normal | Component: Template Haskell
Version: 6.8.2 | Severity: normal
Keywords: | Testcase:
Architecture: Unknown | Os: Unknown
------------------------+---------------------------------------------------
I don't know how tuples are internally implemented in GHC, but the Haskell
report (3.8) specifically establishes two as their lower size bound.
When provided a zero (or null list) arguments, all TupleT, TupP and TupE
behave like the unit type (which is certainly reasonable). However, they
handle argument 1 (or the singleton list) in different ways:
* {{{TupleP [pat]}}} is equivalent to {{{pat}}} (which again, is
perfectly reasonable)
* {{{TupE [exp]}}} behaves as exp (again, it seems right)
However:
* {{{TupleT 1 `AppT` VarT ''Int}}} is a different type than {{{VarT
''Int}}}
See the following two examples:
1. {{{tupE [exp]}}} behaves as expected:
{{{
Prelude Language.Haskell.TH> $(sigE (tupE [[|1|]]) (conT ''Int))
1
}}}
2. {{{tupleT 1}}} doesn't:
{{{
Prelude Language.Haskell.TH> $(sigE [|1|] (tupleT 1 `appT` conT ''Int))
<interactive>:1:2:
No instance for (Num (Int))
arising from the literal `1' at <interactive>:1:2-40
Possible fix: add an instance declaration for (Num (Int))
In the expression: $(sigE [| 1 |] (tupleT 1 `appT` conT 'Int))
In the definition of `it':
it = $(sigE [| 1 |] (tupleT 1 `appT` conT 'Int))
}}}
Probably, since unary tuples are not legal, the typechecker should simply
raise an error when {{{TupleT}}} is found to have received {{{1}}} as
argument.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2358>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the Glasgow-haskell-bugs
mailing list