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 |