id summary reporter owner description type status priority milestone component version resolution keywords cc os architecture failure testcase blockedby blocking related differential
3460 Can't use superclass when type coercions are involved ryani chak "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
}}}
" bug closed low 7.0.1 Compiler (Type checker) 6.10.4 fixed Unknown/Multiple Unknown/Multiple None/Unknown indexed-types/should_compile/T3460