0 INTRODUCTION TO FUNCTIONAL PROGRAMMING Graham Hutton University of Nottingham.

Slides:



Advertisements
Similar presentations
Functional Programming Lecture 10 - type checking.
Advertisements

0 LECTURE 5 LIST COMPREHENSIONS Graham Hutton University of Nottingham.
What is a Parser? A parser is a program that analyses a piece of text to determine its syntactic structure  3 means 23+4.
The > prompt means that the system is ready to evaluate an expression. For example: > 2+3*4 14 > (2+3)*4 20 > sqrt (3^2 + 4^2) 5.0.
0 PROGRAMMING IN HASKELL Chapter 5 - List Comprehensions.
0 PROGRAMMING IN HASKELL Chapter 7 - Higher-Order Functions.
0 PROGRAMMING IN HASKELL Chapter 4 - Defining Functions.
0 PROGRAMMING IN HASKELL Chapter 6 - Recursive Functions Most of this should be review for you.
0 PROGRAMMING IN HASKELL Chapter 2 - First Steps.
0 PROGRAMMING IN HASKELL Chapter 3 - Types and Classes.
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)
0 PROGRAMMING IN HASKELL Chapter 5 – Introduction, The Hugs System, Types and Classes.
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.
1-Nov-15 Haskell II Functions and patterns. Data Types Int + - * / ^ even odd Float + - * / ^ sin cos pi truncate Char ord chr isSpace isUpper … Bool.
0 PROGRAMMING IN HASKELL Chapter 9 - Higher-Order Functions, Functional Parsers.
Overview of the Haskell 98 Programming Language
What is a Type? A type is a name for a collection of related values. For example, in Haskell the basic type Bool contains the two logical values: True.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell 101 Dr. Hyunyoung Lee.
0 PROGRAMMING IN HASKELL Chapter 4 - Defining Functions.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell: More on Functions and List Comprehensions Dr. Hyunyoung Lee.
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,
0 PROGRAMMING IN HASKELL Chapter 2 - First Steps.
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.
6-Jul-16 Haskell II Functions and patterns. Data Types Int + - * / ^ even odd Float + - * / ^ sin cos pi truncate Char ord chr isSpace isUpper … Bool.
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
Conditional Expressions
Midterm recap Total was 80 points Distribution range
PROGRAMMING IN HASKELL
Types CSCE 314 Spring 2016.
Theory of Computation Lecture 4: Programs and Computable Functions II
PROGRAMMING IN HASKELL
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
PROGRAMMING IN HASKELL
CSCE 314: Programming Languages Dr. Dylan Shell
Haskell Types, Classes, and Functions, Currying, and Polymorphism
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Functions and patterns
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Presentation transcript:

0 INTRODUCTION TO FUNCTIONAL PROGRAMMING Graham Hutton University of Nottingham

1 What is Functional Programming? zFunctional programming is style of programming in which the basic method of computation is the application of functions to arguments; zA functional language is one that supports and encourages the functional style. Opinions differ, and it is difficult to give a precise definition, but generally speaking:

Example Summing the integers 1 to 10 in Java: total = 0; for (i = 1; i  10; ++i) total = total+i; The computation method is variable assignment. 2

Example Summing the integers 1 to 10 in Haskell: sum [1..10] The computation method is function application. 3

4 Why is it Useful? Again, there are many possible answers to this question, but generally speaking: zThe abstract nature of functional programming leads to considerably simpler programs; zIt also supports a number of powerful new ways to structure and reason about programs.

5 This Course A series of mini-lectures (with exercises) reviewing a number of basic concepts, using Haskell: zThe Hugs system; zTypes and classes I/II; zDefining functions; zList comprehensions; zRecursive functions; zHigher-order functions; zFunctional parsers; zDefining types.

6 These concepts will be tied together at the end by two extended programming examples, concerning a simple game and a simple compiler. Note: zThe material in this course is based upon my forthcoming book, Programming in Haskell; zPlease ask questions during the lectures!

7 LECTURE 1 THE HUGS SYSTEM Graham Hutton University of Nottingham

8 What is Hugs? zAn interpreter for Haskell, and the most widely used implementation of the language; zAn interactive system, which is well-suited for teaching and prototyping purposes; zHugs is freely available from:

9 The Standard Prelude When Hugs is started it first loads the library file Prelude.hs, and then repeatedly prompts the user for an expression to be evaluated. For example: > 2+3*4 14 > (2+3)*4 20

10 > length [1,2,3,4] 4 > product [1,2,3,4] 24 > take 3 [1,2,3,4,5] [1,2,3] The standard prelude also provides many useful functions that operate on lists. For example:

11 Function Application In mathematics, function application is denoted using parentheses, and multiplication is often denoted using juxtaposition or space. f(a,b) + c d Apply the function f to a and b, and add the result to the product of c and d.

12 In Haskell, function application is denoted using space, and multiplication is denoted using *. f a b + c*d As previously, but in Haskell syntax.

13 Moreover, function application is assumed to have higher priority than all other operators. f a + b Means (f a) + b, rather than f (a + b).

14 Examples Mathematics Haskell f(x) f(x,y) f(g(x)) f(x,g(y)) f(x)g(y) f x f x y f (g x) f x (g y) f x * g y

15 My First Script double x = x + x quadruple x = double (double x) When developing a Haskell script, it is useful to keep two windows open, one running an editor for the script, and the other running Hugs. Start an editor, type in the following two function definitions, and save the script as test.hs:

16 % hugs test.hs Leaving the editor open, in another window start up Hugs with the new script: > quadruple > take (double 2) [1..6] [1,2,3,4] Now both Prelude.hs and test.hs are loaded, and functions from both scripts can be used:

17 factorial n = product [1..n] average ns = sum ns `div` length ns Leaving Hugs open, return to the editor, add the following two definitions, and resave: zdiv is enclosed in back quotes, not forward; zx `f` y is just syntactic sugar for f x y. Note:

18 > :reload Reading file "test.hs" > factorial > average [1..5] 3 Hugs does not automatically reload scripts when they are changed, so a reload command must be executed before the new definitions can be used:

19 Exercises Try out some of the other functions from the standard prelude using Hugs. Work through "My First Script" using Hugs. Show how the functions last and init from the standard prelude could be re-defined using other functions from the prelude. Note: there are many possible answers! (1) (2) (3)

20 LECTURE 2 TYPES AND CLASSES (I) Graham Hutton University of Nottingham

21 What is a Type? A type is a collection of related values. Bool Bool  Bool The logical values False and True. All functions that map a logical value to a logical value.

22 Types in Haskell False :: Bool not :: Bool  Bool not False :: Bool False && True :: Bool We use the notation e :: T to mean that evaluating the expression e will produce a value of type T.

23 zEvery expression must have a valid type, which is calculated prior to evaluating the expression by a process called type inference; zHaskell programs are type safe, because type errors can never occur during evaluation; zType inference detects a very large class of programming errors, and is one of the most powerful and useful features of Haskell. Note:

24 Basic Types Haskell has a number of basic types, including: Char String Integer Int Bool - Logical values - Single characters - Strings of characters - Fixed-precision integers - Arbitrary-precision integers

25 List Types [False,True,False] :: [Bool] [’a’,’b’,’c’,’d’] :: [Char] In general: A list is sequence of values of the same type: [T] is the type of lists with elements of type T.

26 zThe type of a list says nothing about its length: [False,True] :: [Bool] [False,True,False] :: [Bool] [[’a’],[’b’,’c’]] :: [[Char]] Note: zThe type of the elements is unrestricted. For example, we can have lists of lists:

27 Tuple Types A tuple is a sequence of values of different types: (False,True) :: (Bool,Bool) (False,’a’,True) :: (Bool,Char,Bool) In general: (T1,T2,…,Tn) is the type of n-tuples whose ith components have type Ti for any i in 1…n.

28 zThe type of a tuple encodes its arity: (False,True) :: (Bool,Bool) (False,True,False) :: (Bool,Bool,Bool) (’a’,(False,’b’)) :: (Char,(Bool,Char)) (True,[’a’,’b’]) :: (Bool,[Char]) Note: zThe type of the components is unrestricted:

29 Function Types not :: Bool  Bool isDigit :: Char  Bool In general: A function is a mapping from values of one type to values of another type: T1  T2 is the type of functions that map arguments of type T1 to results of type T2.

30 zThe argument and result types are unrestricted. For example, functions with multiple arguments or results are possible using lists or tuples: Note: add :: (Int,Int)  Int add (x,y) = x+y zeroto :: Int  [Int] zeroto n = [0..n]

31 Exercises [’a’,’b’,’c’] (’a’,’b’,’c’) [(False,’0’),(True,’1’)] [isDigit,isLower,isUpper] What are the types of the following values?(1) Check your answers using Hugs.(2)

32 LECTURE 3 TYPES AND CLASSES (II) Graham Hutton University of Nottingham

33 Functions with multiple arguments are also possible by returning functions as results: add’ :: Int  (Int  Int) add’ x y = x+y add’ takes an integer x and returns a function. In turn, this function takes an integer y and returns the result x+y. Curried Functions

34 zadd and add’ produce the same final result, but add takes its two arguments at the same time, whereas add’ takes them one at a time: Note: zFunctions that take their arguments one at a time are called curried functions. add :: (Int,Int)  Int add’ :: Int  (Int  Int)

35 zFunctions with more than two arguments can be curried by returning nested functions: mult :: Int  (Int  (Int  Int)) mult x y z = x*y*z mult takes an integer x and returns a function, which in turn takes an integer y and returns a function, which finally takes an integer z and returns the result x*y*z.

36 Curry Conventions  The arrow  associates to the right. Int  Int  Int  Int To avoid excess parentheses when using curried functions, two simple conventions are adopted: Means Int  (Int  (Int  Int)).

37 zAs a consequence, it is then natural for function application to associate to the left. mult x y z Means ((mult x) y) z. Unless tupling is explicitly required, all functions in Haskell are normally defined in curried form.

38 Polymorphic Types The function length calculates the length of any list, irrespective of the type of its elements. > length [1,3,5,7] 4 > length ["Yes","No"] 2 > length [isDigit,isLower,isUpper] 3

39 This idea is made precise in the type for length by the inclusion of a type variable: length :: [a]  Int For any type a, length takes a list of values of type a and returns an integer. A type with variables is called polymorphic.

40 zMany of the functions defined in the standard prelude are polymorphic. For example: fst :: (a,b)  a head :: [a]  a take :: Int  [a]  [a] zip :: [a]  [b]  [(a,b)] Note:

41 Overloaded Types The arithmetic operator + calculates the sum of any two numbers of the same numeric type. For example: > >

42 This idea is made precise in the type for + by the inclusion of a class constraint: (+) :: Num a  a  a  a For any type a in the class Num of numeric types, + takes two values of type a and returns another. A type with constraints is called overloaded.

43 Classes in Haskell A class is a collection of types that support certain operations, called the methods of the class. Eq Types whose values can be compared for equality and difference using (==) :: a  a  Bool (/=) :: a  a  Bool

44 Eq - Equality types Ord - Ordered types Show - Showable types Haskell has a number of basic classes, including: Read - Readable types Num - Numeric types

45 (==) :: Eq a  a  a  Bool (<) :: Ord a  a  a  Bool show :: Show a  a  String read :: Read a  String  a (  ) :: Num a  a  a  a Example methods:

46 Exercises second xs = head (tail xs) swap (x,y) = (y,x) pair x y = (x,y) double x = x*2 palindrome xs = reverse xs == xs twice f x = f (f x) What are the types of the following functions?(1) Check your answers using Hugs.(2)

47 LECTURE 4 DEFINING FUNCTIONS Graham Hutton University of Nottingham

48 Conditional Expressions As in most programming languages, functions can be defined using conditional expressions. abs :: Int  Int abs n = if n  0 then n else -n abs takes an integer n and returns n if it is non-negative and -n otherwise.

49 Conditional expressions can be nested: signum :: Int  Int signum n = if n < 0 then -1 else if n == 0 then 0 else 1 zIn Haskell, conditional expressions must always have an else branch, which avoids any possible ambiguity problems with nested conditionals. Note:

50 Guarded Equations As an alternative to conditionals, functions can also be defined using guarded equations. abs n | n  0 = n | otherwise = -n As previously, but using guarded equations.

51 Guarded equations can be used to make definitions involving multiple conditions easier to read: zThe catch all condition otherwise is defined in the prelude by otherwise = True. Note: signum n | n < 0 = -1 | n == 0 = 0 | otherwise = 1

52 Pattern Matching Many functions have a particularly clear definition using pattern matching on their arguments. not :: Bool  Bool not False = True not True = False not maps False to True, and True to False.

53 Functions can often be defined in many different ways using pattern matching. For example (&&) :: Bool  Bool  Bool True && True = True True && False = False False && True = False False && False = False True && True = True _ && _ = False can be defined more compactly by

54 False && _ = False True && b = b However, the following definition is more efficient, as it avoids evaluating the second argument if the first argument is False: zThe underscore symbol _ is the wildcard pattern that matches any argument value. Note:

55 List Patterns In Haskell, every non-empty list is constructed by repeated use of an operator : called “cons” that adds a new element to the start of a list. [1,2,3] Means 1:(2:(3:[])).

56 The cons operator can also be used in patterns, in which case it destructs a non-empty list. head :: [a]  a head (x:_) = x tail :: [a]  [a] tail (_:xs) = xs head and tail map any non-empty list to its first and remaining elements.

57 Lambda Expressions A function can be constructed without giving it a name by using a lambda expression. x  x+1 The nameless function that takes a number x and returns the result x+1.

58 Why Are Lambda's Useful? Lambda expressions can be used to give a formal meaning to functions defined using currying. For example: add x y = x+y add = x  ( y  x+y) means

59 compose f g x = f (g x) is more naturally defined by compose f g = x  f (g x) Lambda expressions are also useful when defining functions that return functions as results. For example,

60 Exercises Assuming that else branches were optional in conditional expressions, give an example of a nested conditional with ambiguous meaning. (1) Give three possible definitions for the logical or operator || using pattern matching. (2)

61 Consider a function safetail that behaves in the same way as tail, except that safetail maps the empty list to the empty list, whereas tail gives an error in this case. Define safetail using: (i)a conditional expression; (ii)guarded equations; (iii)pattern matching. Hint: The prelude function null :: [a]  Bool can be used to test if a list is empty. (3)