Can't use superclass when type coercions are involved
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
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.10.4 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler (Type checker) |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |