bluespec-docs/content/chapter4/page2.md
2025-02-12 15:54:12 -05:00

1.7 KiB

+++ title = "struct" weight = 1 +++

Defines a record type (a "pure product"). This is a specialized form of a data definition. The same field name may occur in more than one type.

topDefn  ::= struct typeId {tyVarId }= { { fieldDef ; }} [ derive ]
fieldDef ::= fieldId :: type

Example:

struct Proc  = { pc :: Addr; rf :: RegFile; mem :: Memory }
struct Coord = { x :: Int; y :: Int }

Section 5.6 describes how to construct values of a struct type. A field of a struct type can be extracted either directly using "dot" notation (section 5.7) or using pattern matching (section 6.3).

Tuples

One way to group multiple values together is to use a data definition in which a constructor has multiple fields.

However, there is a built-in notation for a common form of grouping, called "tuples". To group two (or more) values together the Prelude contains a type, PrimPair, for which there is syntactic sugar for type expressions, value expressions, and patterns.

The type has the following definition

struct PrimPair a b = { fst :: a; snd :: b } deriving (Eq, Bits, Bounded)

For type expressions the following shorthand can be used:

(a, b) \equiv PrimPair a b

Or, more generally,

(t_1, t_2, \cdots, t_n) \equiv PrimPair t_1 (PrimPair t_2 (\cdots t_n))

There is a corresponding shorthand for value expressions and patterns:

(a, b) \equiv PrimPair { fst = a; snd = b }

There is also special syntax for the empty tuple. It is written "()" for types, expressions, and patterns. The real type has the following definition

struct PrimUnit = { } deriving (Eq, Bits, Bounded)