Constructor
From HaskellWiki
Constructor can mean:
- Type constructor
- Data constructor
Contents |
1 Type constructor
A type constructor is used to construct new types from given ones.
data Tree a = Tip | Node a (Tree a) (Tree a)
Tree
a
Integer
Maybe String
Tree b
b
a
Tree Int
Tree (Tree Boolean)
2 Data constructor
A data constructor groups values together and tags alternatives in an algebraic data type,
data Tree a = Tip | Node a (Tree a) (Tree a)
Tip
Node
Tree a
Tip
Node
Tip
Tip
Bool
data Bool = True | False
and for all practical purposes you can just think of them as constants belonging to a type.
On the other hand,Node
a
a
Tree a
2.1 Note
Data constructors are not types! They denote values. It would be illegal to writeNode a (Node a) (Node a)
Tree
Node
3 Deconstructing data constructors
All a data constructor does is holding values together. But you want to separate them if you want to use them. This is done via pattern matching,
depth Tip = 0 depth (Node _ l r) = 1 + max (depth l) (depth r)
_
l
r
4 Notes
- You can declare a constructor (for both type and data) to be infix, and this can make your code a lot more readable.
- Tuples are a built in feature of the syntax but are plain old algebraic data types! They have only one constructor though. Having the same name as their types (don't freak out, it's just a matter of convenience, as the type constructors and the data constructors have separate namespaces). So, is really a value of the form(4, True)having the type(,) 4 True, which, too, is written conveniently as(,) Int Boolto make it more readable. Incidentally, the empty tuple type(Int, Bool)with its only value()is used throughout, and is called unit.()
- You can, in fact, name the values grouped together, using the record syntax,
data Person = Person { name :: String, age :: Int, address :: String }
p
age p
