# Introduction to Programming in Haskell Koen Lindström Claessen.

Post on 11-Jan-2016

218 views

TRANSCRIPT

Introduction to Programming in HaskellKoen Lindstrm Claessen

ProgrammingExciting subject at the heart of computingNever programmed?Learn to make the computer obey you!Programmed before?Lucky you! Your knowledge will help a lot......as you learn a completely new way to programEveryone will learn a great deal from this course!

Goal of the CourseStart from the basics, after Datorintroduktion

Learn to write small-to-medium sized programs in Haskell

Introduce basic concepts of computer science

The FlowYou preparein advanceI explainin lectureYou learnwith exercisesYou put to practicewith lab assignmentsTuesdays,FridaysMondays/TuesdaysSubmit end of each weekDo not break the flow!

Exercise SessionsMondays or TuesdaysDepending on what group you are inCome preparedWork on exercises togetherDiscuss and get help from tutorPersonal helpMake sure you understand this weeks things before you leave

Lab AssignmentsWork in pairs(Almost) no exceptions!Lab supervisionBook a time in advanceOne time at a time!Start working on lab when you have understood the matter Submit end of each weekFeedbackReturn: The tutor has something to tell you; fix and submit againOK: You are doneeven this week!

Getting HelpWeekly group sessionspersonal help to understand materialLab supervisionspecific questions about programming assignment at handDiscussion forumgeneral questions, worries, discussions

Assessment Written exam (3 credits)Consists of small programming problems to solve on paperYou need Haskell in your fingersCourse work (2 credits)Complete all labs successfully

A Risk7 weeks is a short time to learn programmingSo the course is fast pacedEach week we learn a lotCatching up again is hardSo do keep up!Read the text book each weekMake sure you can solve the problemsGo to the weekly exercise sessionsFrom the beginning

Course HomepageThe course homepage will have ALL up-to-date information relevant for the courseScheduleLab assignmentsExercisesLast-minute changes(etc.)

http://www.cs.chalmers.se/Cs/Grundutb/Kurser/funht/Or Google for chalmers introduction functional programming

SoftwareSoftware = Programs + Data

DataData is any kind of storable information. Examples:

NumbersLettersEmail messagesSongs on a CDMapsVideo clipsMouse clicksPrograms

ProgramsPrograms compute new data from old data.

Example: Baldurs Gate computes a sequence of screen images and sounds from a sequence of mouse clicks.

Building Software SystemsA large system may contain many millions of lines of code.

Software systems are among the most complex artefacts ever made.

Systems are built by combining existing components as far as possible.Volvo buys engines from Mitsubishi.Bonnier buys Quicktime Video from Apple.

Programming LanguagesPrograms are written in programming languages.

There are hundreds of different programming languages, each with their strengths and weaknesses.

A large system will often contain components in many different languages.

Programming LanguagesCHaskellJavaMLOCaMLC++C#PrologPerlPythonRubyPostScriptSQLErlangPDFbashJavaScriptLispSchemeBASICcshVHDLVerilogLustreEsterelMercuryCurrywhich language should we teach?

Programming Language Featurespolymorphismhigher-order functionsstatically typedparameterized typesoverloadingtype classesobject orientedreflectionmeta-programmingcompilervirtual machineinterpreterpure functionslazyhigh performancetype inferencedynamically typedimmutable datastructuresconcurrencydistributionreal-timeHaskellunificationbacktrackingJavaC

Teaching ProgrammingGive you a broad basisEasy to learn more programming languagesEasy to adapt to new programming languagesHaskell is defining state-of-the-art in programming language developmentAppreciate differences between languagesBecome a better programmer!

Industrial Uses of Functional LanguagesIntel (microprocessor verification)Hewlett Packard (telecom event correlation)Ericsson (telecommunications)Carlstedt Research & Technology (air-crew scheduling)Hafnium (Y2K tool)Shop.com (e-commerce)Motorola (test generation)Thompson (radar tracking)Microsoft (SDV)Jasper (hardware verification)

Why Haskell?Haskell is a very high-level language (many details taken care of automatically).

Haskell is expressive and concise (can achieve a lot with a little effort).

Haskell is good at handling complex data and combining components.

Haskell is not a high-performance language (prioritise programmer-time over computer-time).

A Haskell DemoStart the GHCi Haskell interpreter:

> ghci ___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.6.1, for Haskell 98./ /_\\/ __ / /___| | http://www.haskell.org/ghc/\____/\/ /_/\____/|_| Type :? for help.

Loading package base ... linking ... done.Prelude>The prompt. GHCi is ready for input.

GHCi as a CalculatorPrelude> 2+24Prelude> 2-20Prelude> 2*36Prelude> 2/30.666666666666667Type in expressions, and ghci calculates and prints their value.Multiplication and division look a bit unfamiliar we cannot omit multiplication, or type horizontal lines.23X

Binding and BracketsPrelude> 2+2*38

Prelude> (2+2)*312

Prelude> (1+2)/(3+4)0.428571428571429 Multiplication and division bind more tightly than addition and subtraction so this means 2+6, not 4*3.We use brackets to change the binding (just as in mathematics), so this is 4*3.This is how we write1+23+4

QuizWhat is the value of this expression?Prelude> 1+2/3+4

QuizWhat is the value of this expression?Prelude> 1+2/3+45.66666666666667

Example: Currency ConversionSuppose we want to buy a game costing 53 from a foreign web site.Prelude> 53*9.16642485.82026Exchange rate: 1 = 9.16642 SEKPrice in SEKBoring to type 9.16642 every time we convert a price!

Naming a ValueWe give a name to a value by making a definition.Definitions are put in a file, using a text editor such as emacs.> emacs Examples.hsThe UNIX prompt, not the ghci one!Do this in a separate window, so you can edit and run hugs simultaneously.Haskell files end in .hs

Creating the DefinitionGive the name euroRate to the value 9.16642variable

Using the DefinitionPrelude> :l ExamplesMain> euroRate9.16642Main> 53*euroRate485.82026Main> Load the file Examples.hs into ghci make the definition available.The prompt changes we have now loaded a program.We are free to make use of the definition.

Functional Programming is based on FunctionsA function is a way of computing a result from its argumentsA functional program computes its output as a function of its inputE.g. Series of screen images from a series of mouse clicksE.g. Price in SEK from price in euros

A Function to convert Euros to SEK-- convert euros to SEKsek x = x*euroRateFunction name the name we are defining.Name for the argumentExpression to compute the resultA definition placed in the file Examples.hsA comment to help us understand the program

Using the FunctionMain> :rMain> sek 53485.82026Reload the file to make the new definition available.Call the functionNotation: no brackets!C.f. sin 0.5, log 2, not f(x).sek x = x*euroRatex = 53While we evaluate the right hand side53*euroRate

Binding and Brackets againMain> sek 53485.82026Main> sek 50 + 3461.321Main> sek (50+3)485.82026Main> Different!This is (sek 50) + 3.Functions bind most tightly of all.Use brackets to recover sek 53.No stranger than writingsin and sin ( + )

Converting Back Again-- convert SEK to euroseuro x = x/euroRateMain> :rMain> euro 485.8202653.0Main> euro (sek 49)49.0Main> sek (euro 217)217.0 Testing the program: trying it out to see if does the right thing.

Automating TestingWhy compare the result myself, when I have a computer?Main> 2 == 2TrueMain> 2 == 3False Main> euro (sek 49) == 49True The operator == tests whether two values are equalYes they areNo they arentLet the computer check the result.Note: two equal signs are an operator.One equal sign makes a definition.

Defining the PropertyDefine a function to perform the test for usprop_EuroSek x = euro (sek x) == xMain> prop_EuroSek 53TrueMain> prop_EuroSek 49True Performs the same tests as before but now we need only remember the function name!

Writing Properties in FilesFunctions with names beginning prop_ are properties they should always return TrueWriting properties in filesTells us how functions should behaveTells us what has been testedLets us repeat tests after changing a definitionProperties help us get programs right!

Automatic TestingTesting account for more than half the cost of a software projectWe will use a tool for automatic testingimport Test.QuickCheckAdd first in the file of definitions makes QuickCheck available.Capital letters must appear exactly as they do here.

Running TestsMain> quickCheck prop_EuroSekFalsifiable, after 10 tests:3.75

Main> sek 3.7534.374075Main> euro 34.3740753.75

Runs 100 randomly chosen testsIts not true!The value for which the test fails.Looks OK

The ProblemThere is a very tiny difference between the initial and final values

Calculations are only performed to about 15 significant figuresThe property is wrong!Main> euro (sek 3.75) - 3.754.44089209850063e-016e means

10-16

- Fixing the ProblemThe result should be nearly the sameThe difference should be small say 2 3
Defining Nearly EqualWe can define new operators with names made up of symbolsx ~== y = x-y < 0.000001Define a new operator ~==With arguments x and yWhich returns True if the difference between x and y is less than 0.000001

Testing ~==Main> 3 ~== 3.0000001TrueMain> 3~==4True OKWhats wrong?x ~== y = x-y < 0.000001

Fixing the DefinitionA useful functionMain> abs 33Main> abs (-3)3 Absolute valuex ~== y = abs (x-y) < 0.000001Main> 3 ~== 4False

Fixing the Propertyprop_EuroSek x = euro (sek x) ~== xMain> prop_EuroSek 3True Main> prop_EuroSek 56TrueMain> prop_EuroSek 2True

Name the PriceLets define a name for the price of the game we wantprice = 53Main> sek priceERROR - Type error in application*** Expression : sek price*** Term : price*** Type : Integer*** Does not match : Double

Every Value has a TypeThe :i command prints information about a nameMain> :i priceprice :: Integer

Main> :i euroRateeuroRate :: Double

Integer (whole number) is the type of priceDouble is the type of real numbersFunny name, but refers to double the precision that computers originally used

More TypesMain> :i TrueTrue :: Bool -- data constructor

Main> :i FalseFalse :: Bool -- data constructor

Main> :i seksek :: Double -> Double

Main> :i prop_EuroSekprop_EuroSek :: Double -> Bool The type of truth values, named after the logician BooleThe type of a functionType of the argumentType of the resultType of the result

Types MatterTypes determine how computations are performedMain> 123456789*123456789 :: Double1.52415787501905e+016

Main> 123456789*123456789 :: Integer15241578750190521Correct to 15 figuresSpecify which type to useThe exact result 17 figures(but must be an integer)Hugs must know the type of each expression before computing it.

Type CheckingInfers (works out) the type of every expressionChecks that all types match before running the program

Our ExampleMain> :i priceprice :: Integer

Main> :i seksek :: Double -> Double

Main> sek priceERROR - Type error in application*** Expression : sek price*** Term : price*** Type : Integer*** Does not match : Double

Why did it work before?Main> sek 53485.82026Main> 53 :: Integer53Main> 53 :: Double53.0Main> price :: Integer53Main> price :: DoubleERROR - Type error in type annotation*** Term : price*** Type : Integer*** Does not match : DoubleCertainly works to say 53What is the type of 53?53 can be used with several types it is overloadedGiving it a name fixes the type

Fixing the ProblemDefinitions can be given a type signature which specifies their typeprice :: Doubleprice = 53Main> :i priceprice :: Double

Main> sek price485.82026

Always Specify Type Signatures!They help the reader (and you) understand the programThe type checker can find your errors more easily, by checking that definitions have the types you sayType error messages will be easier to understandSometimes they are necessary (as for price)

Example with Type SignatureseuroRate :: DoubleeuroRate = 9.16642

sek, euro :: Double -> Doublesek x = x*euroRateeuro x = x/euroRate

prop_EuroSek :: Double -> Boolprop_EuroSek x = euro (sek x) ~== x

What is the type of 53?Main> :i 53Unknown reference `53'Main> :t sek 53sek 53 :: Double Main> :t 5353 :: Num a => a

Main> :i *infixl 7 *(*) :: Num a => a -> a -> a -- class member :i only works for namesBut :t gives the type (only) of any expressionIf a is a numeric typeThen 53 can have type aIf a is a numeric typeThen * can have type a->a->a

What is Num exactly?Main> :i Num-- type class...class (Eq a, Show a) => Num a where (+) :: a -> a -> a (-) :: a -> a -> a (*) :: a -> a -> a...-- instances:instance Num Intinstance Num Integerinstance Num Floatinstance Num Doubleinstance Integral a => Num (Ratio a) A class of typesWith these operationsTypes which belong to this class

ExamplesMain> 2 + 3.55.5

Main> True + 3ERROR - Cannot infer instance*** Instance : Num Bool*** Expression : True + 32, +, and 3.5 can all work on DoubleSure enough, Bool is not in the Num class

A Tricky One!Main> sek (-10)-91.6642Main> sek -10ERROR - Cannot infer instance*** Instance : Num (Double -> Double)*** Expression : sek - 10Whats going on?

Operators AgainMain> :i +infixl 6 +(+) :: Num a => a -> a -> a -- class member

Main> :i *infixl 7 *(*) :: Num a => a -> a -> a -- class memberThe binding power (or precedence) of an operator * binds tighter than + because 7 is greater than 6

Giving ~== a PrecedenceMain> 1/2000000 ~== 0ERROR - Cannot infer instance*** Instance : Fractional Bool*** Expression : 1 / 2000000 ~== 0Wrongly interpreted as1 / (2000000 ~== 0)Instead of(1/2000000) ~== 0

Giving ~== a Precedence~== should bind the same way as ==Main> :i ==infix 4 ==(==) :: Eq a => a -> a -> Bool -- class member Main> 1/2000000 ~== 0True infix 4 ~==x ~== y = abs (x-y) < 0.000001

SummaryThink about the properties of your program... and write them downIt helps you understandingthe problem you are solvingthe program you are writingIt helps others understanding what you didco-workerscustomersyou in 1 year from now

Cases and Recursion

Example: The squaring functionExample: a function to compute

-- sq x returns the square of xsq :: Integer -> Integersq x = x * x

Evaluating FunctionsTo evaluate sq 5:Use the definitionsubstitute 5 for x throughoutsq 5 = 5 * 5Continue evaluating expressionssq 5 = 25Just like working out mathematics on papersq x = x * x

Example: Absolute ValueFind the absolute value of a number-- absolute x returns the absolute value of xabsolute :: Integer -> Integerabsolute x = undefined

Example: Absolute ValueFind the absolute value of a numberTwo cases!If x is positive, result is xIf x is negative, result is -x-- absolute x returns the absolute value of xabsolute :: Integer -> Integerabsolute x | x > 0 = undefinedabsolute x | x < 0 = undefinedPrograms must often choose between alternativesThink of the cases! These are guards

Example: Absolute ValueFind the absolute value of a numberTwo cases!If x is positive, result is xIf x is negative, result is -x-- absolute x returns the absolute value of xabsolute :: Integer -> Integerabsolute x | x > 0 = xabsolute x | x < 0 = -xFill in the result in each case

Example: Absolute ValueFind the absolute value of a numberCorrect the code-- absolute x returns the absolute value of xabsolute :: Integer -> Integerabsolute x | x >= 0 = xabsolute x | x < 0 = -x>= is greater than or equal,

Evaluating GuardsEvaluate absolute (-5)We have two equations to use!Substitute absolute (-5) | -5 >= 0 = -5absolute (-5) | -5 < 0 = -(-5)absolute x | x >= 0 = xabsolute x | x < 0 = -x

Evaluating GuardsEvaluate absolute (-5)We have two equations to use!Evaluate the guards absolute (-5) | False = -5absolute (-5) | True = -(-5)absolute x | x >= 0 = xabsolute x | x < 0 = -xDiscard this equationKeep this one

Evaluating GuardsEvaluate absolute (-5)We have two equations to use!Erase the True guard absolute (-5) = -(-5)absolute x | x >= 0 = xabsolute x | x < 0 = -x

Evaluating GuardsEvaluate absolute (-5)We have two equations to use!Compute the result absolute (-5) = 5absolute x | x >= 0 = xabsolute x | x < 0 = -x

NotationWe can abbreviate repeated left hand sides

Haskell also has if then elseabsolute x | x >= 0 = xabsolute x | x < 0 = -xabsolute x | x >= 0 = x | x < 0 = -xabsolute x = if x >= 0 then x else -x

Example: Computing PowersCompute (without using built-in x^n)

Example: Computing PowersCompute (without using built-in x^n)Name the functionpower

Example: Computing PowersCompute (without using built-in x^n)Name the inputspower x n = undefined

Example: Computing PowersCompute (without using built-in x^n)Write a comment-- power x n returns x to the power npower x n = undefined

Example: Computing PowersCompute (without using built-in x^n)Write a type signature-- power x n returns x to the power npower :: Integer -> Integer -> Integerpower x n = undefined

How to Compute power?We cannot writepower x n = x * * xn times

A Table of Powers

Each row is x* the previous oneDefine power x n to compute the nth rownpower x n011x2x*x3x*x*x

A Definition?

Testing:Main> power 2 2ERROR - stack overflow power x n = x * power x (n-1)Why?

A Definition?

Testing:Main> power 2 2Program error: pattern match failure: power 2 0 power x n | n > 0 = x * power x (n-1)

A Definition?

Testing:Main> power 2 24 power x 0 = 1power x n | n > 0 = x * power x (n-1)First row of the tableThe BASE CASE

RecursionFirst example of a recursive functionDefined in terms of itself!

Why does it work? Calculate:power 2 2 = 2 * power 2 1power 2 1 = 2 * power 2 0power 2 0 = 1power x 0 = 1power x n | n > 0 = x * power x (n-1)

RecursionFirst example of a recursive functionDefined in terms of itself!

Why does it work? Calculate:power 2 2 = 2 * power 2 1power 2 1 = 2 * 1power 2 0 = 1power x 0 = 1power x n | n > 0 = x * power x (n-1)

RecursionFirst example of a recursive functionDefined in terms of itself!

Why does it work? Calculate:power 2 2 = 2 * 2power 2 1 = 2 * 1power 2 0 = 1power x 0 = 1power x n | n > 0 = x * power x (n-1)No circularity!

RecursionFirst example of a recursive functionDefined in terms of itself!

Why does it work? Calculate:power 2 2 = 2 * power 2 1power 2 1 = 2 * power 2 0power 2 0 = 1power x 0 = 1power x n | n > 0 = x * power x (n-1)The STACK

Recursion Reduce a problem (e.g. power x n) to a smaller problem of the same kindSo that we eventually reach a smallest base caseSolve base case separatelyBuild up solutions from smaller solutionsPowerful problem solving strategyin any programming language!

Counting the regionsn lines. How many regions? remove one line ...problem is easier!when do we stop?

The SolutionAlways pick the base case as simple as possible!regions :: Integer -> Integerregions 0 = 1regions n | n > 0 = regions (n-1) + n

Course Text BookThe Craft of Functional Programming (second edition), by Simon Thompson. Available at Cremona.An excellent book which goes well beyond this course, so will be useful long after the course is over.

Read Chapter 1 to 4 before the laboratory sessions on Wednesday, Thursday and Friday.uses Hugs instead of GHCi

Course Web PagesURL: http://www.cs.chalmers.se/Cs/Grundutb/Kurser/funht/Updated almost daily!These slidesSchedulePractical informationAssignmentsDiscussion board

Welcome to the functional programming course very exciting subject at the heart of CS.Many have never programmed before: in for a treat, learning how to make the computer do what you sayMany have already done some programming: much use for knowledge, but will learn to program in a completely new way.All will learn a great deal from this course.

Recommended