## Wrong error message for type family definition that is wrong in multiple ways

```
GHCi, version 8.1.20160212: http://www.haskell.org/ghc/ :? for help
Prelude> :set -XTypeFamilies
Prelude> type family T where { Maybe T = Int }
<interactive>:2:23: error:
• Too many parameters to T:
T is unexpected;
expected only no parameters
• In the type family declaration for ‘T’
```

This error message is wrong ("Too many parameters to `T`

").

Seems like GHC checks whether the equation `Maybe T = Int`

has the right number of arguments before it checks whether it is actually headed by `T`

. Then the error message is worded in a way that assumes the instance head actually was `T`

.

The 7.10 error message was better in this regard:

```
<interactive>:3:23:
Number of parameters must match family declaration; expected 0
In the type family declaration for ‘T’
```

but it would be even better to generate the error below (that is generated once the number of arguments is correct) for the original program:

```
Prelude> type family T a where { Maybe (T ()) = Int }
<interactive>:5:25: error:
• Mismatched type name in type family instance.
Expected: T
Actual: Maybe
• In the type family declaration for ‘T’
```

We should generate that error before kind-checking the definition too.

I don't really understand the difference between these two cases though, so maybe my guess is wrong.

```
Prelude> type family T where { T () = Int }
<interactive>:10:23: error:
• Too many parameters to T:
() is unexpected;
expected only no parameters
• In the type family declaration for ‘T’
Prelude> type family T :: * -> * where { T () = Int }
<interactive>:11:33: error:
• Number of parameters must match family declaration; expected 0
• In the equations for closed type family ‘T’
In the type family declaration for ‘T’
```

(As an aside, "expected only no parameters" is awkward, if there is some legitimate way to generate this message. It should just be "expected no parameters".)

## Trac metadata

Trac field | Value |
---|---|

Version | 8.1 |

Type | Bug |

TypeOfFailure | OtherFailure |

Priority | low |

Resolution | Unresolved |

Component | Compiler (Type checker) |

Test case | |

Differential revisions | |

BlockedBy | |

Related | |

Blocking | |

CC | |

Operating system | |

Architecture |