# Basic Types

## Bool – logical values&#x20;

**Bool** is a logical data type that can be either `True` or `False`.

## Int – fixed-precision integers

**Int** can contain integers, both negative and positive whole numbers (e.g. `-50`, `50`) up to a certain size which is limited by a fixed amount of memory, hence the term fixed-precision. GHC can hold values in the range of `(-2^63)` to `(2^63 - 1)` for **Int** types - going outside those ranges will yield unexpected results.

## Integer – arbitrary-precision integers&#x20;

**Integer** is the same as Int except it does not have a limit to the values it can hold. Performance-wise, it is better to use Int if we know our values will not go out of range, as most computers have built-in hardware for dealing with fixed-precision integers.

## Float – single-precision floating-point numbers

**Float** can contain decimal numbers (e.g. `-1.5`, `6.23`, `50.0`) up to a certain precision which is limited by a fixed amount of memory. The term floating-point comes from this memory limitation, which limits the number of digits (precision) that can come after the decimal point based on the size of the number.

## Double – double-precision floating-point numbers

**Double** is the same type as float, containing decimal numbers but with double the memory assigned for storage for increased precision.&#x20;

## Char – single character

**Char** is a type for characters – it can hold any Unicode character including control characters such as `'\n'` (a new line character) or `'\t'` (tab stop character). **Char** type values must be enclosed in single quotes `''`.&#x20;

## String – strings of characters

**Strings** simply hold a string of characters – they are in fact a type `[Char]` (a list of **Char** type values) in Haskell. Strings must be enclosed in double-quotes `""`, e.g. `"Haskell is great"`.
