Skip to content

Improve Error Reporting: Record does not match type when using Record Expressions #1280

@JanWosnitza

Description

@JanWosnitza

What

type Record = {field:int}
let l : int = {field=0}

Compiler says:

The type 'int' does not contain a field 'field'

OR

type Record = {field1:int; field2:int}
let l : int = {Record.field1=0; field2=1}

Compiler says:

The type 'int' does not contain a field 'field2'

Why

The error message doesn't tell you what the actual error is.
Of course, the above example is trivial, but for example if you pass a record expression to a library function that needs a list, you get really confused.

type Record = {field1:int; field2:int}
let doSomething (xs) = List.map (fun {field1=x} -> x) xs

doSomething {Record.field1=0; field2=0}

The type 'Record list' does not contain a field 'field2'

How

The usual error message when a type does not match:

This expression was expcted to have type
    'a list
but here has type
    Record

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions