Haskell - Colorado School of Mines

Download Report

Transcript Haskell - Colorado School of Mines

Haskell
Chapter 2
Chapter 2



Type inference
Type variables
Type classes
What type is that?

:t expression => type

:t ‘a’



:t [ ]




‘a’ :: Char
read “a has type of Char”
[] :: [a]
[] denotes a list
tuples have unique types
:t (1,2)

(1,2) :: (Num t1, Num t) => (t, t1)
Specify type declaration for fn
removeNonUpperCase :: [Char] -> [Char]
removeNonUppercase st = [c | c <- st, c `elem` ['A'..'Z']]

takes a list of characters, returns a list of characters
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z


takes 3 integers, returns an integer
Syntax for addThree is covered in chapter 5
Common Data Types
Type names start with capital letters.
 Int. Bounded whole number.
 Integer. Really big whole numbers.
 Float. Single precision.
 Double. Double precision.
 Bool. True and False.
 Char. Unicode character.
 Tuples. Also empty tuple ()
Don’t begin your function names with upper case!
Type variables/Polymorphic types
Some functions can operate on various types (e.g., list
functions)
:t head
head :: [a] -> a
 Takes a list of any type, returns that type
 Notice the type variable is lower case
 Convention is to use 1-character names for type vars
:t fst
fst :: (a, b) -> a
 Notice two different letters, types don’t need to match

Type classes


Interface that defines some behavior
If a type is an instance of that type class, then it supports that
behavior
If you decide to make a type an instance of a type class, you
must define the behaviors associated with that type class.
:t (==)
(==) :: Eq a => a -> a -> Bool
 => is a class constraint
 Read as: “The equality function takes two values that are of the
same type and returns a Bool. The type of those two values
must be an instance of the Eq class.”

Common Type Classes

Eq



== and /=
an Eq constraint for a type variable means the function uses ==
or /= somewhere in its definition*
Ord



Values can be put in some order
>, <, >=,<=,compare
Being an Eq is a prereq for Ord
* how does this compare to C++ templates? Java?
Common Type Classes, continued

Show




values can be represented as strings
commonly used by show, e.g., show 3 => “3”
cannot “show” a function, e.g., “show doubleMe” is not valid
Read





Takes a string and returns a value whose type is an instance of Read
read "2" + 4.5
Needs to know what type to return, can’t just do: read "2"
Can use type annotation: read "2" :: Int
Remember: Haskell is statically typed. Doesn’t actually “read” until
execution… but type needs to be decided at compile time.
Common Type Classes, continued

Enum





Sequentially ordered types
Values can be enumerated
Have defined successors (succ) and predecessors (pred)
(), Bool, Char, Ordering, Int, Integer, Float, Double are Enum
Bounded



minBound and maxBound
maxBound :: Int
type is (Bounded a) => a - polymorphic constants
Common Type Classes, continued

Num







numeric, instances act like numbers
:t 20
20 :: Num a => a
Also polymorphic constants
:t (*)
(*) :: Num a => a -> a -> a
NOTE: Num a is no longer Show a. Sometimes you need both
in the type declaration, e.g., (Num a, Show a) => (a, a) -> a
Common Type Classes, continued

Integral








Includes only whole numbers (Int and Integer)
fromIntegral :: (Integral a, Num b) => a -> b
Multiple class constraints (a and b)
Takes an integral value and converts it into more general
number
:t length
length :: [a] -> Int
length [1,2,3] + 5.5 – Error!
fromIntegral (length [1,2,3]) + 5.5


Very useful, because Haskell doesn’t convert integral to floating point
automatically.
8.5
Play (no share)

Spend 5-10 minutes



tryout the :t command
play with show and read
play with fromIntegral