Ticket #3638 (closed bug: fixed)
Redundant signature required with RULES and GADTs
| Reported by: | rl | Owned by: | |
|---|---|---|---|
| Priority: | normal | Milestone: | 7.0.1 |
| Component: | Compiler (Type checker) | Version: | 6.13 |
| Keywords: | Cc: | ||
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | None/Unknown | Difficulty: | Unknown |
| Test Case: | gadt/T3638 | Blocked By: | |
| Blocking: | Related Tickets: |
Description
Here is a small program:
data T a where TInt :: T Int
foo :: T Int -> Int
foo TInt = 0
{-# RULES "foo" forall x. foo x = case x of { TInt -> 0 } #-}
GHC complains:
GADT pattern match with non-rigid result type `t'
Solution: add a type signature for the entire case expression
In a case alternative: TInt -> 0
In the expression: case x of { TInt -> 0 }
When checking the transformation rule "foo"
And indeed, changing the rule to
{-# RULES "foo" forall x. foo x = case x of { TInt -> 0 } :: Int #-}
works. The signature is redundant, though, because the type of the case is determined by the type of the rule head.
Change History
Note: See
TracTickets for help on using
tickets.
