Skip to content

Improve "No instance for HasField" error messages

The built-in HasField x r a constraint is solved automatically whenever x is a field label that belongs to the type r (except if the field is not in scope, or for a few other corner cases, e.g. the field type is existential, higher-rank or unboxed). If it is not solved automatically, however, the error message is typically just

No instance for (HasField "foo" T ()) arising from ...

which is rather uninformative. It would be better to customise the error reporting:

  • If the type r is not a record type at all, we could mention that fact.
  • If the type r is a record type, but does not have the named field, we could suggest similarly-named fields (like how the renamer suggests possibilities for not-in-scope identifiers).
  • If the field does belong to the type, but is not in scope, we could say that and suggest importing it.
  • If the field type is existential, higher-rank or unboxed, we could explain that such fields cannot be used with HasField.
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information