190 likes | 198 Views
This course teaches the fundamentals of functional programming using the language Haskell. Topics include data types, type inference, recursion, higher-order functions, and modules.
E N D
COSC 4P41Functional Programming • Instructor: Michael Winter • Office J323 • Office Hours: Mon 10:00am – noon, Thu 01:00pm – 03:00pm • email: mwinter@brocku.ca • Webpage: http://www.cosc.brocku.ca/~mwinter/Courses/4P41/ • Course Description (Brock Calendar):Introduction to functional programming using the languages Haskell. Topics include all data types, type inference, pattern-matching, recursion, polymorphism, higher-order functions, lazy vs eager evaluation, modules and monads. • Prerequisites:three and one-half COSC credits or permission of the instructor. • Haskell: http://www.haskell.org
Textbooks • Main Text • Haskell, The Craft of Functional Programming, 3rd edition, S. Thompson, Addison - Wesley (2011), ISBN 0-201-88295-7 • Supplemental Texts • The Haskell 2010 Report, Simon Marlow, online. • Real World Haskell, Bryan O'Sullivan, John Goerzen, Don Steward, O'Reilly (2009), ISBN 978-0-596-51498-3 • The Haskell School of Expression, P. Hudak, Cambridge University Press (2000), ISBN 0-521-64408-9
Course Work • Marking Scheme • Lab Tests (3x20%) 60% • Final Lab Exam 40% • Tests & Exam (D205) Lab Test 1 September 27 @ 11:00am – 12:30pm Lab Test 2 October 18 @ 11:00am – 12:30pm Lab Test 3 November 01 @ 11:00am – 12:30pm Exam December 05 @ tba
A mark of at least 40% on the final exam is required to achieve a passing grade in this course. • Consideration regarding illness for test dates will only be considered if accompanied with the completed Departmental Medical Excuse form. • Academic misconduct is a serious offence. The principle of academic integrity, particularly of doing one's own work, documenting properly (including use of quotation marks, appropriate paraphrasing and referencing/citation), collaborating appropriately, and avoiding misrepresentation, is a core principle in university study. Students should consult Section VII, 'Academic Misconduct", in the "Academic Regulations and University Polices“ entry in the Undergraduate Calendar, available at brocku.ca/webcal to view a fuller description of prohibited actions, and the procedures and penalties.
Course Outline * Oct 08-12 is Reading Week.
Imperative languages • Von Neumann model: • store with addressable locations • machine code: • effect achieved by changing contents of store locations • instructions executed in sequence, flow of control altered by jumps • imperative language: • variable corresponds to store location • instructions executed in sequence, flow of control altered by conditional and loop statements • efficient implementation since close to design of conventional computers
Functional languages • computational model: lambda calculus • mathematical functions: domain, range • functional languages achieve effect by applying functions • functional vs. imperative languages • store location • assignment statement vs. application of a function (expressions) • side-effects • aliasing • referential transparency
Features of functional languages • usually strongly typed (modern languages) • algebraic type definitions • mathematical based notation • no (implicit) pointers • higher-order functions • can accept functions as parameters • can return functions as results • recursion as a basic principle • application of rewrite rule: • function call replaced by code body • run-time overhead garbage collection • slogan: define “what to do”, not “how to do”
inputs 12 output + 46 34 Int Int + Int What is a function? A function is something which produces an output value depending on the input value(s). A type is a collection of values. Usually functions are considered to take values of specific types as input, and produce values of another type. A functional program is basically a list of definitions of functions.
Definitions Haskell definitions are of the form: name :: type name = expression Examples: size :: Int size = (12+13)*4 square :: Int -> Int square n = n*n
{-######################################################### FirstScript.hs Simon Thompson, June 1998 The purpose of this script is - to illustrate some simple definitions over integers (Int); - to give a first example of a script. #########################################################-} -- The value size is an integer (Int), defined to be -- the sum of twelve and thirteen. size :: Int size = 12+13 -- The function to square an integer. square :: Int -> Int square n = n*n -- The function to double an integer. double :: Int -> Int double n = 2*n -- An example using double, square and size. example :: Int example = double (size - square (2+2))
########################################################### FirstLiterate.lhs Simon Thompson, June 1998 The purpose of this script is - to illustrate some simple definitions over integers (Int); - to give a first example of a literate script. ########################################################### The value size is an integer (Int), defined to be the sum of twelve and thirteen. > size :: Int > size = 12+13 The function to square an integer. > square :: Int -> Int > square n = n*n The function to double an integer. > double :: Int -> Int > double n = 2*n An example using double, square and size. > example :: Int > example = double (size - square (2+2))
The Booleans • type Bool • operations exOr :: Bool -> Bool -> Bool exOr x y = (x || y) && not (x && y)
The integers • type Int: range –2147483648…2147483647 • type Integer: range unbounded • operations
Relational operators and overloading (==) for integers and Booleans. This means that (==) will have the type Int -> Int -> Bool Bool -> Bool -> Bool Indeed t -> t -> Bool if the type t carries an equality. (==) :: Eq a => a -> a -> Bool
The rational numbers • type Rational (import Ratio) • operations and +, *, -, negate, abs
The characters • type Char ‘a’ ‘\t’ tab ‘\n’ newline ‘\\’ backslash ‘\’’ single quote ‘\”’ double quote ‘\97’ character with ASCII code 97, i.e., ‘9’
Layout mystery x = x*x +x +2 next x = … fun v1 v2 … vn | g1 = e1 | g2 = e2 … | otherwise = er
Operators and Do-it-yourself operators (+) :: Int -> Int -> Int (+) 2 3 = 2 + 3 2 `max` 3 = max 2 3 Operator symbols !,#,$,%,&,*,+,.,/,<,=,>,?,\,^,|,:,-,~ (&&&) :: Int -> Int -> Int x &&& y | x > y = y | otherwise = x