4.types and Typeclasses in Haskell
4.types and Typeclasses in Haskell
TYPECLASSES
The type of every expression is known at compile time, which leads to safer code.
Everything in Haskell has a type, so the compiler can reason quite a lot about your
program before compiling it.
Haskell has type inference. If we write it's a number. It can infer that on its own, so
we don't have to explicitly write out the types of our functions and expressions to
get things done.
Example:
removeNonUppercase :: [Char] -> [Char]
removeNonUppercase has a type of [Char] -> [Char], meaning that it maps
from a string to a string.
TYPES IN HASKELL
Int:
Int stands for integer. It's used for whole numbers. 7 can be an Int but 7.2 cannot. Int is
bounded, which means that it has a minimum and a maximum value. Usually on 32-bit
machines the maximum possible Int is 2147483647 and the minimum is -2147483648.
Integer:
Integer stands for, er … also integer. The main difference is that it's not bounded so it can
be used to represent really really big numbers.
Example
factorial :: Integer -> Integer
factorial n = product [1..n]
ghci> factorial 50
30414093201713378043612608166064768844377641568960512000000000000
FLOAT AND DOUBLE
Float:
Float is a real floating point with single precision.
Example:
circumference :: Float -> Float
circumference r = 2 * pi * r
ghci> circumference 4.0
25.132742
Double
Double is a real floating point with double the precision
circumference' :: Double -> Double
circumference' r = 2 * pi * r
ghci> circumference' 4.0
BOOL CHAR AND TUPLES
• Bool is a boolean type. It can have only two
values: True and False.
• Tuples are types but they are dependent on their length as well as
the types of their components, Note that the empty tuple () is also
a type which can only have a single value: ()
NUM TYPE CLASS
• A typeclass defines a set of methods that is shared across multiple types.
• For a type to belong to a typeclass, it needs to implement the methods of
that typeclass.
• Num typeclass:
UNDERSTANDING TYPECLASS
ghci> :t (function name)
(function name) :: (typeclass a) => a -> a -> Bool
x <= y = compare x y /= GT
x < y = compare x y == LT
x >= y = compare x y /= LT
x > y = compare x y == GT
fromIntegral function
• It has a type declaration of fromIntegral :: (Num b, Integral a) => a -> b.
• From its type signature we see that it takes an integral number and turns it into a more general
number.
• It is useful when you want integral and floating point types to work together nicely.
• For instance, the length function has a type declaration of length :: [a] -> Int instead of
HASKELL TYPECLASS CHART