Punning
It is common to see type definitions like the following:
The first occurrence of ChessPiece is a type, but the second is a value, namely a function of type Int -> Int -> ChessPiece.
The name of the type and value don't have to be the same, but it's common to make this choice to avoid having to invent a new name like MkChessPiece.
Punning and recursive types¶
There is even more potential for confusion when a type is recursive, so that the type can itself appear on the right hand side of its definition:
Here, the second occurrence of BinTree is a value, and the rest are types.
Common examples of punning¶
(Bool, Int)is a type, but(True, 4)is a value[Bool]is the type of lists of booleans, but[True]is a value, a list with a single element.()is a type, and contains a single value, also called().ReaderTis both to a type, and a value, the constructor for that type. Similarly forExceptT,StateTand others