Functional Programming in Haskell Motivation through Concrete Examples Adapted from Lectures by Simon Thompson.

Slides:



Advertisements
Similar presentations
1 Scheme and Functional Programming Aaron Bloomfield CS 415 Fall 2005.
Advertisements

0 LECTURE 5 LIST COMPREHENSIONS Graham Hutton University of Nottingham.
0 PROGRAMMING IN HASKELL Chapter 5 - List Comprehensions.
Chapter 15 Other Functional Languages. Copyright © 2007 Addison-Wesley. All rights reserved. Functional Languages Scheme and LISP have a simple syntax.
0 PROGRAMMING IN HASKELL Chapter 6 - Recursive Functions Most of this should be review for you.
0 PROGRAMMING IN HASKELL Chapter 6 - Recursive Functions.
Advanced Programming Andrew Black and Tim Sheard Lecture 4 Intro to Haskell.
0 PROGRAMMING IN HASKELL Chapter 3 - Types and Classes.
Cse536 Functional Programming 1 7/14/2015 Lecture #2, Sept 29, 2004 Reading Assignments –Begin Chapter 2 of the Text Home work #1 can be found on the webpage,
Comp 205: Comparative Programming Languages Functional Programming Languages: More Lists Recursive definitions List comprehensions Lecture notes, exercises,
0 PROGRAMMING IN HASKELL Typeclasses and higher order functions Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and.
0 PROGRAMMING IN HASKELL An Introduction Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources)
Functional Languages. Why? Referential Transparency Functions as first class objects Higher level of abstraction Potential for parallel execution.
Haskell. 2 GHC and HUGS Haskell 98 is the current version of Haskell GHC (Glasgow Haskell Compiler, version 7.4.1) is the version of Haskell I am using.
0 REVIEW OF HASKELL A lightening tour in 45 minutes.
0 PROGRAMMING IN HASKELL Chapter 7 - Defining Functions, List Comprehensions.
0 PROGRAMMING IN HASKELL Some first steps Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources)
Chapter 9: Functional Programming in a Typed Language.
Functional Programming With examples in F#. Pure Functional Programming Functional programming involves evaluating expressions rather than executing commands.
A Second Look At ML 1. Outline Patterns Local variable definitions A sorting example 2.
COMP313A Functional Programming (1)
1 Haskell Kevin Atkinson John Simmons. 2 Contents Introduction Type System Variables Functions Module System I/O Conclusions.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell 101 Dr. Hyunyoung Lee.
Com Functional Programming Lazy Evaluation Marian Gheorghe Lecture 13 Module homepage Mole & ©University of Sheffieldcom2010.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell: More on Functions and List Comprehensions Dr. Hyunyoung Lee.
Chapter SevenModern Programming Languages1 A Second Look At ML.
Haskell Basics CSCE 314 Spring CSCE 314 – Programming Studio Using GHC and GHCi Log in to unix.cse.tamu.edu (or some other server) From a shell.
0 PROGRAMMING IN HASKELL Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources) Odds and Ends,
Functional Programming Lecture 3 - Lists Muffy Calder.
Haskell Chapter 5, Part II. Topics  Review/More Higher Order Functions  Lambda functions  Folds.
Haskell. GHC and HUGS Haskell 98 is the current version of Haskell GHC (Glasgow Haskell Compiler, version 7.4.1) is the version of Haskell I am using.
An introduction to functional programming using Haskell CENG242 –Recitation 1.
Lecture 16: Advanced Topic: Functional Programming CS5363 Compiler and Programming Languages.
1 PROGRAMMING IN HASKELL Lecture 2 Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources)
1 PROGRAMMING IN HASKELL An Introduction Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources)
0 PROGRAMMING IN HASKELL Typeclasses and higher order functions Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and.
Lecture 14: Advanced Topic: Functional Programming
Set Comprehensions In mathematics, the comprehension notation can be used to construct new sets from old sets. {x2 | x  {1...5}} The set {1,4,9,16,25}
Set Comprehensions In mathematics, the comprehension notation can be used to construct new sets from old sets. {x2 | x  {1...5}} The set {1,4,9,16,25}
Polymorphic Functions
Functional Programming
Functional Programming
Laziness and Infinite Datastructures
Midterm recap Total was 80 points Distribution range
Types CSCE 314 Spring 2016.
Theory of Computation Lecture 4: Programs and Computable Functions II
PROGRAMMING IN HASKELL
A lightening tour in 45 minutes
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Haskell.
CSE 3302 Programming Languages
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
FP Foundations, Scheme In Text: Chapter 14.
CSCE 314: Programming Languages Dr. Dylan Shell
Haskell Types, Classes, and Functions, Currying, and Polymorphism
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Lazy Programming Lazy evaluation:
CSE 3302 Programming Languages
CSCE 314: Programming Languages Dr. Dylan Shell
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Presentation transcript:

Functional Programming in Haskell Motivation through Concrete Examples Adapted from Lectures by Simon Thompson

Prasad CS776 2 Functional Programming Given the functions above invertColour flipH sideBySide superimpose flipV and the horse picture, how do you get … ( expression and evaluation )

Prasad CS776 3 Definitions in Haskell name :: Type name = expression blackHorse :: Picture blackHorse = invertColour horse rotate :: Picture -> Picture rotate pic = flipH (flipV pic)

Prasad CS776 4 Higher-level Evaluation is about expressions and values, not storage locations. No need to allocate/deallocate storage: garbage collection. Values don't change over program execution: contrast x=x+1 etc. of Java, C, … … instead we describe relations between values by means of (fixed) functions.

Prasad CS776 5 Declarative … proofs possible Programs describe themselves: square n = n*n double n = 2*n 'The square of n is n*n, for every integer n.' Programs are equations. So we can write proofs using the definitions. square (double n) = square (2*n) = (2*n)*(2*n) = 2*2*n*n = double (double (square n))

Prasad CS776 6 Evaluation freedom Evaluation can occur in any order... (4-3)+(2-1) (4-3)+(2-1) (4-3)+(2-1) (4-3)+1 1+(2-1) … and can choose to evaluate only what is needed, when it is needed: lazy evaluation (more later). Can also evaluate in parallel … efficiently?

Prasad CS776 7 History First 'functional' language, LISP, defined c … popular in AI in 70s/80s. Now represented best by Scheme. Weakly typed; allows side-effects and eval. Next generation: ML (1980…), Miranda (1985…) and Haskell (1990…). Strongly-typed; ML allows references and thus side-effects. Miranda and Haskell: pure and lazy. FP (1982): heroic experiment by Backus (FORTRAN, ALGOL).

Prasad CS776 8 Haskell and Hugs Named after Haskell Brooks Curry: mathematician and logician; inventor of the -calculus. Haskell 98 is the recent 'standard' version of Haskell. Various implementations: Hugs (interpreter for Windows, Mac, Unix) and GHC, NHC, HBC (compilers).

Basics: guards and base types How many of three integers are equal … ? howManyEqual :: Int -> Int -> Int -> Int howManyEqual n m k | n==m && m==k = 3 | n==m || m==k || k==n = 2 | otherwise = 1 If we reach here they're not all equal … … and if we reach here they're all different.

Prasad CS Regular and literate scripts In a regular script there are definitions and comments: -- FirstScript.hs -- 5 October Double an integer. double :: Int -> Int double n = 2*n Everything is program, except comments beginning --. In a literate script there are comments and definitions: FirstLit.lhs 5 October 2000 Double an integer. > double :: Int -> Int > double n = 2*n Everything is comment, except program beginning >.

Prasad CS How many pieces with n cuts?

Prasad CS How many pieces with n cuts? No cuts: 1 piece. With the n th cut, you get n more pieces: cuts :: Int -> Int cuts n | n==0 = 1 | n>0 = cuts (n-1) + n | otherwise = 0

Prasad CS The Pictures case study. Using a powerful library of functions over lists. Pattern matching Recursion Generic functions Higher-order functions …

Prasad CS Using Hugs expr Evaluate expr :type expr Give the type of expr :l Blah Load the file Blah.hs :r Reload the last file :? Help: list commands :e Edit the current file :q Quit

Prasad CS Functions over pictures A function to flip a picture in a vertical mirror: inputoutput flipV

Prasad CS Functions over pictures A function to invert the colours in a picture: invertColour

Prasad CS Functions over pictures A function to superimpose two pictures: superimpose

Prasad CS Functions over pictures A function to put one picture above another: above

Prasad CS Functions over pictures A function to put two pictures side by side: sideBySide

Prasad CS A naïve implementation type Picture = [String] type String = [Char] A Picture is a list of String s. A String is a list of Char (acters) ## ##..#.....##.....#...# #...#...#...#...#...###.#..#....#..##...#...# #...# #..# #.# ##....

Prasad CS How are they implemented? flipH Reverse the list of strings. flipV Reverse each string. rotateflipH then flipV (or v.versa). above Join the two lists of strings. sideBySide Join corresponding lines. invertColour Change each Char … and each line. superimpose Join each Char … join each line.

Prasad CS How are they implemented? flipHreverse flipVmap reverse rotateflipV. flipH above++ sideBySidezipWith (++) invertColourmap (map invertChar) superimposezipWith (zipWith combine)

Prasad CS Lists and types Haskell is strongly typed: detect all type errors before evaluation. For each type t there is a type [t], 'list of t '. reverse [] = [] reverse (x:xs) = reverse xs ++ [x] reverse :: [a] -> [a] a is a type variable: reverse works over any list type, returning a list of the same type.

Prasad CS Flipping in a vertical mirror flipV :: Picture -> Picture flipV [] = [] flipV (x:xs) = reverse x : flipV xs Run along the list, applying reverse to each element Run along the list, applying … to every element. General pattern of computation.

Prasad CS Implementing the mapping pattern map f [] = [] map f (x:xs) = f x : map f xs map :: (a -> b) -> [a] -> [b] Examples over pictures: flipV pic = map reverse pic invertColour pic = map invertLine pic invertLine line = map invertChar line

Prasad CS Functions as data Haskell allows you to pass functions as arguments and return functions as results, put them into lists, etc. In contrast, in Pascal and C, you can only pass named functions, not functions you build dynamically. map isEven = ?? map isEven :: [Int] -> [Bool] It is a partial application, which gives a function: give it a [Int] and it will give you back a [Bool]

Prasad CS Partial application in Pictures flipV = map reverse invertColour = map (map invertChar) A function [Char]->[Char] A function [[Char]]->[[Char]]

Prasad CS Another pattern: zipping together sideBySide [l 1,l 2,l 3 ] [r 1,r 2,r 3 ] = [ l 1 ++r 1, l 2 ++r 2, l 3 ++r 3 ] zipWith :: (a->b->c) -> [a] -> [b] -> [c] zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys zipWith f xs ys = []

Prasad CS In the case study … sideBySide = zipWith (++) Superimposing two pictures: need to combine individual elements: combine :: Char -> Char -> Char combine top btm = if (top=='.' && btm=='.') then '.' else '#' superimpose = zipWith (zipWith combine)

Prasad CS Parsing "((2+3)-4)" is a sequence of symbols, but underlying it is a structure

Prasad CS Arithmetical expressions An expression is either a literal, such as 234 or a composite expression: the sum of two expressions (e1+e2) the difference of two expressions (e1-e2) the product of two expressions (e1*e2)

Prasad CS How to represent these structures? data Expr = Lit Int | Sum Expr Expr | Minus Expr Expr | Times Expr Expr Elements of this algebraic data type include Lit 3434 Sum (Lit 45) (Lit 3)(45+3) Minus (Sum (Lit 2) (Lit 3)) (Lit 4)((2+3)-4)

Prasad CS Counting operators data Expr = Lit Int | Sum Expr Expr | Minus... How many operators in an expression? Definition using pattern matching cOps (Lit n) = 0 cOps (Sum e1 e2) = cOps e1 + cOps e2 + 1 cOps (Minus e1 e2) = cOps e1 + cOps e2 + 1 cOps (Times e1 e2) = cOps e1 + cOps e2 + 1

Prasad CS Evaluating expressions data Expr = Lit Int | Sum Expr Expr | Minus... Literals are themselves … eval (Lit n) = n … in other cases, evaluate the two arguments and then combine the results … eval (Sum e1 e2) = eval e1 + eval e2 eval (Minus e1 e2) = eval e1 - eval e2 eval (Times e1 e2) = eval e1 * eval e2

Prasad CS List comprehensions Example list x = [4,3,2,5] [ n+2 | n<-x, isEven n] run through the n in x … select those which are even … 4242 and add 2 to each of them 6464 giving the result [6,4]

Prasad CS List comprehensions Example lists x = [4,3,2] y = [12,17] [ n+m | n<-x, m<-y] run through the n in x … and for each, run through the m in y … add corresponding pairs giving the result [16,21,15,20,14,19]

Prasad CS Quicksort qsort [] = [] qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x = [y | y <- xs, y < x] elts_greq_x = [y | y = x]

Prasad CS MergeSort mergeSort [] = [] mergeSort [x] = [x] mergeSort xs | size >= 1 = merge (mergeSort front) (mergeSort back) where size = length xs `div` 2 front = take size xs back = drop size xs

Prasad39 Merging x y x <= y? merge [1, 3] [2, 4]1 : merge [3] [2, 4] 1 : 2 : merge [3] [4] 1 : 2 : 3 : merge [] [4] 1 : 2 : 3 : [4] [1,2,3,4]

Prasad CS Defining Merge merge (x : xs) (y : ys) | x <= y= x : merge xs (y : ys) | x > y= y : merge (x : xs) ys merge [] ys= ys merge xs []= xs One list gets smaller. Two possible base cases.

Prasad CS Lazy evaluation Only evaluate what is needed … infinite lists nums :: Int -> [Int] nums n = n : nums (n+1) sft (x:y:zs) = x+y sft (nums 3) = sft (3: nums 4) = sft (3: 4: nums 5) = 7

Prasad CS The list of prime numbers primes = sieve (nums 2) sieve (x:xs) = x : sieve [ z | z<-xs, z `mod` x /= 0] To sieve (x:xs) return x, together with the result of sieveing xs with all multiples of x removed.