
heh heh. I've got to record this for posterity. I've never known an example before. Some code that compiles in Hugs and works fine; but GHC (8.6.4) can't typecheck so rejects. It's an example in the 2011 'System F with Type Equality Coercions', section 2.3 discussing FunDeps; and used to justify the extra power of type inference in Type Families as opposed to FunDeps. Full details discussed here: https://gitlab.haskell.org/ghc/ghc/issues/16430#note_189393 class F a b | a -> b instance F Int Bool class D a where { op :: F a b => a -> b } instance D Int where { op _ = True } True that doesn't compile as given. Hugs says: 'Inferred type is not general enough'. GHC says 'Couldn't match expected type `b' with actual type `Bool''/ '`b' is a rigid type variable'. (So essentially the same failure of typechecking.) With a little help for the type inference, this compiles in Hugs. class C a b | a -> b instance C Int Bool f :: (C Int b, TypeCast b Bool) => b -> Bool f x = typeCast x With `TypeCast` defined as for HList. But GHC still rejects it; and rejects a version with a `(~)` constraint instead of the `TypeCast`. AntC

On Mon, Mar 25, 2019 at 6:24 PM Anthony Clayden < anthony_clayden@clear.net.nz> wrote:
...
Errk. pasted the wrong example. The code that works is class F a b | a -> b instance F Int Bool class D a where { op :: (F a b) => a -> b } instance (TypeCast Bool b') => D Int where { op _ = typeCast True } That dangling `b'` in the constraint is weird. Anyhow: compiles in Hugs, doesn't in GHC. Unless someone here can persuade it? AntC
participants (1)
-
Anthony Clayden