Polymorphism and Classes · Disadvantages of Enumerated data types Reprogramming required to add a...

Post on 30-Sep-2020

4 views 0 download

Transcript of Polymorphism and Classes · Disadvantages of Enumerated data types Reprogramming required to add a...

Polymorphism and ClassesFunctional Programming and Reasoning

Dr Hans Georg Schaathun

University of Surrey

Spring 2010

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 1 / 37

Outline

1 Algebraic Datatypes

2 Polymorphism

3 Classes of types

4 Summary

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 2 / 37

This session

After this session, you shouldunderstand the concepts of overloading and polymorphismunderstand how polymorphism can make software developmentfaster and simplerunderstand the concept of classes in haskell, and be able to useclasses to generalise definitionshave a brief understanding of the use of algebraic data types

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 3 / 37

Warnings

Polymorphism is a general concept.and it is called polymorphism also in Java.

Java classes are not classes; they are data typesthe Java analog of a class is the ensemble of a class and all itsderived classes

A class is an ensemble of data types (with similar properties)this use of the word class is not particular to functionalprogrammingAda has the same terminology, and is object-oriented andimperative

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 4 / 37

Algebraic Datatypes

Outline

1 Algebraic DatatypesEnumerated TypesProduct typesFunctions

2 Polymorphism

3 Classes of types

4 Summary

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 5 / 37

Algebraic Datatypes Enumerated Types

Defining your own data types

Haskell allows user-defined data typesthese are usually algebraic data types

The simplest form is enumerated typesjust listing each possible data type

For instancedata Season = Spring | Summer | Autumn | Winterdata Faculty = FEPS | FAHS | FML | FHMS

The elements (Spring etc.) are called constructorsa constructor, when called, creates (‘constructs’) a new data object

Constructure names always start with a capital

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 6 / 37

Algebraic Datatypes Enumerated Types

Functions on enumerated types

Functions can be defined for each possible value

weather :: Season -> Stringweather Spring = "Sunny"weather Summer = "Warm"weather Autumn = "Wet"weather Winter = "Cold"

Or wild-cards can be used

weather :: Season -> Stringweather Summer = "Warm"weather _ = "Cold"

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 7 / 37

Algebraic Datatypes Enumerated Types

Functions on enumerated types

Functions can be defined for each possible value

weather :: Season -> Stringweather Spring = "Sunny"weather Summer = "Warm"weather Autumn = "Wet"weather Winter = "Cold"

Or wild-cards can be used

weather :: Season -> Stringweather Summer = "Warm"weather _ = "Cold"

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 7 / 37

Algebraic Datatypes Enumerated Types

Strings vs. Enumerated type

Consider a Staff database(Surname, First Name, DoB, Faculty)

What data type for Faculty?String?

"FEPS", "FMS", etc.Enumerated?

data Faculty = FEPS | FMS | ...

and why?

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 8 / 37

Algebraic Datatypes Enumerated Types

Strings vs. Enumerated type

Advantages of Enumerated data typesType checking – cannot be mistaken for another StringCompact storage and fast comparison

Disadvantages of Enumerated data typesReprogramming required to add a faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 9 / 37

Algebraic Datatypes Enumerated Types

Strings vs. Enumerated type

Advantages of Enumerated data typesType checking – cannot be mistaken for another StringCompact storage and fast comparison

Disadvantages of Enumerated data typesReprogramming required to add a faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 9 / 37

Algebraic Datatypes Enumerated Types

Strings vs. Enumerated type

Advantages of Enumerated data typesType checking – cannot be mistaken for another StringCompact storage and fast comparison

Disadvantages of Enumerated data typesReprogramming required to add a faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 9 / 37

Algebraic Datatypes Enumerated Types

Strings vs. Enumerated type

Advantages of Enumerated data typesType checking – cannot be mistaken for another StringCompact storage and fast comparison

Disadvantages of Enumerated data typesReprogramming required to add a faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 9 / 37

Algebraic Datatypes Product types

Product data types

The simplest product data type would bedata Length = Feet Intheight :: Lengthheight = Feet 6

Why do we use a special data type?Why not just Int?

The type Length cannot be confused with IntA function defined on Int does not work on Lengthand vice versa

Such strong typing will catch many bugs

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 10 / 37

Algebraic Datatypes Product types

Product data types

The simplest product data type would bedata Length = Feet Intheight :: Lengthheight = Feet 6

Why do we use a special data type?Why not just Int?

The type Length cannot be confused with IntA function defined on Int does not work on Lengthand vice versa

Such strong typing will catch many bugs

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 10 / 37

Algebraic Datatypes Product types

Product data types

The simplest product data type would bedata Length = Feet Intheight :: Lengthheight = Feet 6

Why do we use a special data type?Why not just Int?

The type Length cannot be confused with IntA function defined on Int does not work on Lengthand vice versa

Such strong typing will catch many bugs

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 10 / 37

Algebraic Datatypes Product types

Product data types

The simplest product data type would bedata Length = Feet Intheight :: Lengthheight = Feet 6

Why do we use a special data type?Why not just Int?

The type Length cannot be confused with IntA function defined on Int does not work on Lengthand vice versa

Such strong typing will catch many bugs

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 10 / 37

Algebraic Datatypes Product types

More product data types

Product data types is an alternative to tuplesdata Person = Id String Intp :: Personp = Id "John Smith" 42

Suppose we need feet and inches for the lengthdata Length = Feet Int Intheight :: Lengthheight = Feet 5 10

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 11 / 37

Algebraic Datatypes Product types

More product data types

Product data types is an alternative to tuplesdata Person = Id String Intp :: Personp = Id "John Smith" 42

Suppose we need feet and inches for the lengthdata Length = Feet Int Intheight :: Lengthheight = Feet 5 10

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 11 / 37

Algebraic Datatypes Product types

Product data types in general

Combine enumeration and product types

data Shape =Circle Float |Rectangle Float Float |Triangle Float Float Float

For a Circle the Radius is givenFor Rectangle: height + widthFor Triangle (e.g.): width (base line), height, angle (lower leftcorner)

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 12 / 37

Algebraic Datatypes Functions

Functions on algebraic typesPattern matching again

We need a function for the area of a Shapearea :: Shape -> Float

Function definition based on pattern matchingDefine a function for each pattern

area (Circle r) = pi*rˆ2 (pi defined by the Prelude)area (Rectangle x y) = x * yarea (Triangle x y _) = x*y/2

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 13 / 37

Algebraic Datatypes Functions

Functions on algebraic typesPattern matching again

We need a function for the area of a Shapearea :: Shape -> Float

Function definition based on pattern matchingDefine a function for each pattern

area (Circle r) = pi*rˆ2 (pi defined by the Prelude)area (Rectangle x y) = x * yarea (Triangle x y _) = x*y/2

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 13 / 37

Algebraic Datatypes Functions

Example of product data typesStaff record

Recall the tuple: (Surname, First Name, DoB, Faculty)Surname and First name are StringsWhat data type for Date of Birth?Algebraic?

data Date = Dat Int Int Int

data Faculty = FEPS | FAHS | FML | FHMS

data Person = Pers String String Date Faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 14 / 37

Algebraic Datatypes Functions

Example of product data typesStaff record

Recall the tuple: (Surname, First Name, DoB, Faculty)Surname and First name are StringsWhat data type for Date of Birth?Algebraic?

data Date = Dat Int Int Int

data Faculty = FEPS | FAHS | FML | FHMS

data Person = Pers String String Date Faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 14 / 37

Algebraic Datatypes Functions

Example of product data typesStaff record

Recall the tuple: (Surname, First Name, DoB, Faculty)Surname and First name are StringsWhat data type for Date of Birth?Algebraic?

data Date = Dat Int Int Int

data Faculty = FEPS | FAHS | FML | FHMS

data Person = Pers String String Date Faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 14 / 37

Algebraic Datatypes Functions

Example of product data typesStaff record

Recall the tuple: (Surname, First Name, DoB, Faculty)Surname and First name are StringsWhat data type for Date of Birth?Algebraic?

data Date = Dat Int Int Int

data Faculty = FEPS | FAHS | FML | FHMS

data Person = Pers String String Date Faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 14 / 37

Algebraic Datatypes Functions

Example of product data typesStaff record

Recall the tuple: (Surname, First Name, DoB, Faculty)Surname and First name are StringsWhat data type for Date of Birth?Algebraic?

data Date = Dat Int Int Int

data Faculty = FEPS | FAHS | FML | FHMS

data Person = Pers String String Date Faculty

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 14 / 37

Polymorphism

Outline

1 Algebraic Datatypes

2 PolymorphismPolymorphism

3 Classes of types

4 Summary

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 15 / 37

Polymorphism Polymorphism

Polymorphism

polymorphism ∼ «has many shapes»

Polymorphic functions apply to different types of dataFor instance the length of a list

length :: [a] -> Intwhere a is a type variablei.e. a matches any type

Or concatenation(++) :: [a] -> [a] -> [a]a is an arbitrary typebut all three instances of a are the same type

Polymorphism saves us the trouble of typing several similardefinitions

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 16 / 37

Polymorphism Polymorphism

Polymorphism

polymorphism ∼ «has many shapes»

Polymorphic functions apply to different types of dataFor instance the length of a list

length :: [a] -> Intwhere a is a type variablei.e. a matches any type

Or concatenation(++) :: [a] -> [a] -> [a]a is an arbitrary typebut all three instances of a are the same type

Polymorphism saves us the trouble of typing several similardefinitions

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 16 / 37

Polymorphism Polymorphism

Polymorphism

polymorphism ∼ «has many shapes»

Polymorphic functions apply to different types of dataFor instance the length of a list

length :: [a] -> Intwhere a is a type variablei.e. a matches any type

Or concatenation(++) :: [a] -> [a] -> [a]a is an arbitrary typebut all three instances of a are the same type

Polymorphism saves us the trouble of typing several similardefinitions

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 16 / 37

Polymorphism Polymorphism

Polymorphic implementationFor example

The length function could be defined as

length :: [a] -> Intlength [] = 0length (x:xs) = 1 + length xs

This is an example of recursion over lists

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 17 / 37

Polymorphism Polymorphism

Polymorphic implementationFor example

The length function could be defined as

length :: [a] -> Intlength [] = 0length (x:xs) = 1 + length xs

This is an example of recursion over lists

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 17 / 37

Polymorphism Polymorphism

Polymorphism versus Overloading

Polymorphism and Overloading both allowsame function name on different types

However, there is a key differencePolymorphism has a single function definition

applicable to several typesOverloading allows different definitions

for different types

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 18 / 37

Polymorphism Polymorphism

Polymorphism versus Overloading

Polymorphism and Overloading both allowsame function name on different types

However, there is a key differencePolymorphism has a single function definition

applicable to several typesOverloading allows different definitions

for different types

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 18 / 37

Polymorphism Polymorphism

Polymorphism versus Overloading

Polymorphism and Overloading both allowsame function name on different types

However, there is a key differencePolymorphism has a single function definition

applicable to several typesOverloading allows different definitions

for different types

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 18 / 37

Polymorphism Polymorphism

Polymorphism versus Overloading

Polymorphism and Overloading both allowsame function name on different types

However, there is a key differencePolymorphism has a single function definition

applicable to several typesOverloading allows different definitions

for different types

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 18 / 37

Classes of types

Outline

1 Algebraic Datatypes

2 Polymorphism

3 Classes of typesSome simple examplesHow to overloadThe Show classDeriving classes

4 Summary

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 19 / 37

Classes of types Some simple examples

What is a class?

First: do not confuse it with a Java class.A class is a collection of types

common propertiescertain functions or operations defined

In Java and C++, a class is one typethe closest Java equivalent is probably interfaces

Both meanings are commonAda classes are similar to Haskell’s

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 20 / 37

Classes of types Some simple examples

What is a class?

First: do not confuse it with a Java class.A class is a collection of types

common propertiescertain functions or operations defined

In Java and C++, a class is one typethe closest Java equivalent is probably interfaces

Both meanings are commonAda classes are similar to Haskell’s

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 20 / 37

Classes of types Some simple examples

What is a class?

First: do not confuse it with a Java class.A class is a collection of types

common propertiescertain functions or operations defined

In Java and C++, a class is one typethe closest Java equivalent is probably interfaces

Both meanings are commonAda classes are similar to Haskell’s

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 20 / 37

Classes of types Some simple examples

An example class

isMatch :: ( Eq a ) => (a,a) -> BoolisMatch (x,y) = x == y

( Eq a ) => : a restricted to class EqEq is a class of types with equality

== is definedThe polymorphic function can call ==

we do not know the type abut we know that == is defined

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 21 / 37

Classes of types Some simple examples

Other classes

Ord : <, >, etc. are definedShow : convertible to a String (show function)Num : numeric: +, −, ×, etc. defined... and user-defined classesYou will often need built-in classes for your polymorphism

... there is an example in the exercises.

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 22 / 37

Classes of types Some simple examples

Other classes

Ord : <, >, etc. are definedShow : convertible to a String (show function)Num : numeric: +, −, ×, etc. defined... and user-defined classesYou will often need built-in classes for your polymorphism

... there is an example in the exercises.

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 22 / 37

Classes of types Some simple examples

Other classes

Ord : <, >, etc. are definedShow : convertible to a String (show function)Num : numeric: +, −, ×, etc. defined... and user-defined classesYou will often need built-in classes for your polymorphism

... there is an example in the exercises.

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 22 / 37

Classes of types Some simple examples

Sorting functions

Sorting lists is a common task ...[x1, x2, . . . , xn]such that ∀i , xi ≤ xi+1

When does this make sense?when ≤ is defined ...

sort :: ( Ord a ) => [a] -> [a]

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 23 / 37

Classes of types Some simple examples

Sorting functions

Sorting lists is a common task ...[x1, x2, . . . , xn]such that ∀i , xi ≤ xi+1

When does this make sense?when ≤ is defined ...

sort :: ( Ord a ) => [a] -> [a]

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 23 / 37

Classes of types Some simple examples

Sorting functions

Sorting lists is a common task ...[x1, x2, . . . , xn]such that ∀i , xi ≤ xi+1

When does this make sense?when ≤ is defined ...

sort :: ( Ord a ) => [a] -> [a]

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 23 / 37

Classes of types How to overload

User-defined classes... or how to achieve overloading

Reconsider the exercises of Week 2, where you madecapitaliseChar :: Char -> CharcapitaliseString :: String -> String

Would it not be easier with an overloaded function?capitalise :: a -> a

Not straight forward,you cannot just define capitalise twicewith different type declarations

Classes allow you to do it.Define capitilise twicelinked to different class instances

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 24 / 37

Classes of types How to overload

User-defined classes... or how to achieve overloading

Reconsider the exercises of Week 2, where you madecapitaliseChar :: Char -> CharcapitaliseString :: String -> String

Would it not be easier with an overloaded function?capitalise :: a -> a

Not straight forward,you cannot just define capitalise twicewith different type declarations

Classes allow you to do it.Define capitilise twicelinked to different class instances

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 24 / 37

Classes of types How to overload

User-defined classes... or how to achieve overloading

Reconsider the exercises of Week 2, where you madecapitaliseChar :: Char -> CharcapitaliseString :: String -> String

Would it not be easier with an overloaded function?capitalise :: a -> a

Not straight forward,you cannot just define capitalise twicewith different type declarations

Classes allow you to do it.Define capitilise twicelinked to different class instances

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 24 / 37

Classes of types How to overload

Capitalising Characters and StringsDefining the class

class Cap a wherecapitalise :: a -> a

The class has one property:a function capitalise is defined

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 25 / 37

Classes of types How to overload

Capitalising Characters and StringsDefining an instance

instance Cap Char wherecapitalise x | b < 97 = x

| b > 122 = x| otherwise = toEnum ((fromEnum x) - 32)

where b = fromEnum x

Char becomes an instance of CapProvide a definition for each function declared in the class

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 26 / 37

Classes of types How to overload

Capitalising Characters and StringsDefining a polymorphic instance

instance Cap a => Cap [a] wherecapitalise = map capitalise

Polymorphic instanceValid for any list type [a]

if the constituent type a is an instance of Cap

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 27 / 37

Classes of types How to overload

Class and InstanceAnother example

A new class can be defined as follows

class MyClass a wheremyFunction :: [a] -> a

an existing datatype can be made an instance of the class

instance MyClass Int wheremyFunction xs = foldr1 (+) xs

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 28 / 37

Classes of types How to overload

Polymorphic InstancesAnother example

The definition of myFunction would apply to any numberThus a polymorphic instance is possible:

instance Num a => MyClass a wheremyFunction xs = foldr1 (+) xs

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 29 / 37

Classes of types The Show class

Standard functionsPrintable types (Show)

New types are not printable by default... not members of the Show class

now :: Season

Main> nowERROR - Cannot find "show" function for:

*** Expression : now

*** Of type : Season

This is cumbersome when you test functionsHow do you solve this?

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 30 / 37

Classes of types The Show class

Making it printableInstance of Show

1 Make an instance2 Define the show function

show :: a -> String

instance Show Season whereshow Summer = "Summer"show Spring = "Spring"show Winter = "Winter"show Autumn = "Fall"

Do you need other classes?

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 31 / 37

Classes of types Deriving classes

Common classes

Some classes should cover most data typesOrd, Eq, Show, etc.

Simple, straight-forward definitionsHaskell can create instances automatically

you just need to askThe deriving key word does the job.

data Season = Spring | Summer | Autumn | Winterderiving Eq

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 32 / 37

Classes of types Deriving classes

Common classes

Some classes should cover most data typesOrd, Eq, Show, etc.

Simple, straight-forward definitionsHaskell can create instances automatically

you just need to askThe deriving key word does the job.

data Season = Spring | Summer | Autumn | Winterderiving Eq

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 32 / 37

Classes of types Deriving classes

Common classes

Some classes should cover most data typesOrd, Eq, Show, etc.

Simple, straight-forward definitionsHaskell can create instances automatically

you just need to askThe deriving key word does the job.

data Season = Spring | Summer | Autumn | Winterderiving Eq

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 32 / 37

Classes of types Deriving classes

Common classes

Some classes should cover most data typesOrd, Eq, Show, etc.

Simple, straight-forward definitionsHaskell can create instances automatically

you just need to askThe deriving key word does the job.

data Season = Spring | Summer | Autumn | Winterderiving Eq

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 32 / 37

Classes of types Deriving classes

Making it printableA short-cut

data Season = Spring | Summer | Autumn | Winterderiving Show

In this case the string shown would be the constructor

Main> SpringSpring

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 33 / 37

Classes of types Deriving classes

Deriving multiple classes

Several classes may be derivedRemember parentheses!

data Season = Spring | Summer | Autumn | Winterderiving (Eq, Show)

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 34 / 37

Classes of types Deriving classes

Ordering

data Season = Spring | Summer | Autumn | Winter deriving Ord

Ordering on enumerated types may be usefuluse guards to treat different groups of values differently

deriving does not solve all problemsFor product types you often want to define your own ordering

to make sure that the right elements are compared

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 35 / 37

Classes of types Deriving classes

Ordering

data Season = Spring | Summer | Autumn | Winter deriving Ord

Ordering on enumerated types may be usefuluse guards to treat different groups of values differently

deriving does not solve all problemsFor product types you often want to define your own ordering

to make sure that the right elements are compared

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 35 / 37

Classes of types Deriving classes

Ordering

data Season = Spring | Summer | Autumn | Winter deriving Ord

Ordering on enumerated types may be usefuluse guards to treat different groups of values differently

deriving does not solve all problemsFor product types you often want to define your own ordering

to make sure that the right elements are compared

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 35 / 37

Summary

Outline

1 Algebraic Datatypes

2 Polymorphism

3 Classes of types

4 Summary

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 36 / 37

Summary

Summary

We have presented a number of powerful techniques for functiondesign

PolymorphismOverloadingClasses – as a tool for overloading and polymorphismUser-defined types – Algebraic Datatypes

General techniques – applies in many formsStudy the exercises

if you cannot do the exercises... you will struggle with the exam too

Dr Hans Georg Schaathun Polymorphism and Classes Spring 2010 37 / 37