Ticket #3826 (closed bug: fixed)

Opened 3 years ago

Last modified 3 years ago

Can't infer type (type family as "element" type)

Reported by: spl Owned by: simonpj
Priority: normal Milestone: 7.0.1
Component: Compiler (Type checker) Version: 6.12.1
Keywords: type families Cc: leather@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: GHC rejects valid program Difficulty:
Test Case: indexed-types/should_compile/T3826 Blocked By:
Blocking: Related Tickets:

Description

Suppose I have a class C,

class C a where
  type E a
  c :: E a -> a -> a

a datatype T,

data T a = T a

and an instance of C for T

instance C (T a) where
  type E (T a) = a
  c x (T _) = T x

I would like to write a function such as f

f t@(T x) = c x t

without a type signature. Unfortunately, I can't because GHC tells me

    Couldn't match expected type `t' against inferred type `T (E t)'
    In the second argument of `c', namely `t'
    In the expression: c x t
    In the definition of `f': f (t@(T x)) = c x t

There are at least three possible ways to write the above code such that it works.

(1) Give a type signature for f

f :: T a -> T a

(2) Define the class C using an equality constraint

class C t where
  type E t
  c :: (E t ~ e) => e -> t -> t

(3) Define the class C using functional dependencies

class C t e | t -> e where
  c :: e -> t -> t

But the real question is why don't I get a type for f?

This has been tested in GHC 6.10.1 and 6.12.1.

Attachments

Test.lhs Download (1.1 KB) - added by spl 3 years ago.
Test case

Change History

Changed 3 years ago by spl

Test case

Changed 3 years ago by igloo

  • owner set to simonpj
  • milestone set to 6.14.1

This sounds like a question for you, Simon.

Changed 3 years ago by simonpj

Thank you! Yet another example that should start working when the new constraint solver is in place. I'll keep track of it, but it'll be a couple of months at least.

Simon

Changed 3 years ago by igloo

  • blockedby 4232 added

Changed 3 years ago by igloo

  • blockedby 4232 removed

Changed 3 years ago by simonpj

  • status changed from new to closed
  • testcase set to indexed-types/should_compile/T3826
  • resolution set to fixed

Happily this does now indeed work with the new typechecker, so closing.

Simon

Note: See TracTickets for help on using tickets.