Skip to content

Wildcard character in pattern matches with discriminated unions should raise an error if there is no field to match #1592

@abelbraaksma

Description

@abelbraaksma

If a discriminated union case doesn't define a field, then a wildcard used in a matching pattern should raise an error, just as a variable reference would.

Repro steps

Consider the type:

type Help =
    | Today
    | Tomorrow

And the module:

module HelpMod =
    let helpWhen =
        function
        | Today  -> "help me Today!"
        | Tomorrow -> "help me Tomorrow!"

Now consider the following module:

// compiles just fine, but shouldn't
module HelpMod =
    let helpWhen =
        function
        | Today _ -> "help me Today!"
        | Tomorrow  _ -> "help me Tomorrow!"

And compare that with this:

// fails to compile: FS0019: This constructor is applied to 1 argument(s) but expects 0
module HelpMod =
    let helpWhen =
        function
        | Today  x -> "help me Today!"
        | Tomorrow x -> "help me Tomorrow!"

Expected behavior

Neither should compile. The wildcard character is not ignorable. Compare, for instance, fun _ -> true, this is the same as fun a -> true. While the wildcard is more flexible in pattern matching, it is a replacement character for something, but here it seems to replace nothingness, which doesn't exist in F# (it isn't even unit here).

Actual behavior

The example with the wildcard compiles (but I think it shouldn't).

Known workarounds

None. Unless a workaround is to ignore this. But I think it is a syntax error that is ignored by the compiler.

Related information

Using F# 4.0, .NET 4.6 (didn't test with other .NET versions) with VS2015 Update 3.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions