Skip to content

Custom data types which accept only values enumerated by programmer. #9229

Closed
@jesseray

Description

@jesseray

In Haskell (using GHC), you can write

data Tanks = 0 | 1 | 2 | 3 | 4

to define a new data type called Tanks that can have the value 0 or 1 or 2 or 3 or 4. When you define a variable of type Tanks, you must define it as having one of the values enumerated in the data type definition. If you try to use a value that is not enumerated in the data type definition, such as 5,

hearts :: Tanks
hearts = 5

the compiler will abandon compilation and display an error message that says (in essence) that the value is not acceptable.

By defining new data types that accept the enumerated values and no others, module developers can prevent other programmers from abusing their modules because the abuses will cause compiler errors. In this way, module developers increase the chances that, if the code compiles, the code works correctly.

Rust does not support this without workarounds.

A programmer could try to use an Enum, but these enumerate constructors with valid Rust identifiers, not values. As such, the programmer would need to define constructors to use as placeholders for each of the values they want enumerated. That would fill their modules with boilerplate code and make them unpleasant for other programmers to use. Hence, I do not consider this workaround viable.

The programmer could use a Struct with a private field and a Setter method which prevents the field from being given a value that the module developer does not want. This workaround involves much less boilerplate and the module remains pleasant for other programmers to work with. Hence, I do consider this workaround viable. Even so, when compared with the Haskell approach, it strikes me as avoidably ugly, because Haskell does not require any boilerplate code at all.

Can the Rust language and compiler be extended to allow programmers to define new data types that can have only the values enumerated by the programmer, but without boilerplate code?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions