Ticket #3460 (closed bug: fixed)
Can't use superclass when type coercions are involved
| Reported by: | ryani | Owned by: | chak |
|---|---|---|---|
| Priority: | low | Milestone: | 7.0.1 |
| Component: | Compiler (Type checker) | Version: | 6.10.4 |
| Keywords: | Cc: | ||
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | None/Unknown | Difficulty: | Unknown |
| Test Case: | indexed-types/should_compile/T3460 | Blocked By: | |
| Blocking: | Related Tickets: |
Description
GHC 6.10.4.
{-# LANGUAGE TypeFamilies, FlexibleContexts #-}
module Coercion where
class Nat n where
toInt :: n -> Int
class (Nat (Arity f)) => Model f where
type Arity f
ok :: Model f => f -> Arity f -> Int
ok _ n = toInt n
bug :: (Model f, Arity f ~ n) => f -> n -> Int
bug _ n = toInt n
I expect that (Model f) brings (Nat (Arity f)) into scope, and that (Arity f ~ n) means we can derive (Nat n). But the compiler disagrees.
Coercion.hs:14:10:
Could not deduce (Nat n) from the context (Arity f ~ n, Model f)
arising from a use of `toInt' at Coercion.hs:14:10-16
Possible fix:
add (Nat n) to the context of the type signature for `bug'
In the expression: toInt n
In the definition of `bug': bug _ n = toInt n
Change History
Note: See
TracTickets for help on using
tickets.
