Programming Paradigms

Similar documents
CSC312 Principles of Programming Languages : Functional Programming Language. Copyright 2006 The McGraw-Hill Companies, Inc.

Haskell An Introduction

Introduction to Haskell

CS 11 Haskell track: lecture 1

Haskell: Lists. CS F331 Programming Languages CSCE A331 Programming Language Concepts Lecture Slides Friday, February 24, Glenn G.

Practical Haskell. An introduction to functional programming. July 21, Practical Haskell. Juan Pedro Villa-Isaza. Introduction.

An introduction to functional programming. July 23, 2010

Programming Paradigms

Intro to Haskell Notes: Part 1

FUNCTIONAL PROGRAMMING 1 HASKELL BASICS

Haskell 101. (Version 1 (July 18, 2012)) Juan Pedro Villa Isaza

It is better to have 100 functions operate one one data structure, than 10 functions on 10 data structures. A. Perlis

n n Try tutorial on front page to get started! n spring13/ n Stack Overflow!

Advanced Topics in Programming Languages Lecture 2 - Introduction to Haskell

Haskell Introduction Lists Other Structures Data Structures. Haskell Introduction. Mark Snyder

Programming Paradigms

CS 360: Programming Languages Lecture 10: Introduction to Haskell

CSCE 314 TAMU Fall CSCE 314: Programming Languages Dr. Flemming Andersen. Haskell Functions

Box-and-arrow Diagrams

Haske k ll An introduction to Functional functional programming using Haskell Purely Lazy Example: QuickSort in Java Example: QuickSort in Haskell

An introduction introduction to functional functional programming programming using usin Haskell

Haskell Types, Classes, and Functions, Currying, and Polymorphism

CSc 372. Comparative Programming Languages. 8 : Haskell Function Examples. Department of Computer Science University of Arizona

Solution sheet 1. Introduction. Exercise 1 - Types of values. Exercise 2 - Constructors

The List Datatype. CSc 372. Comparative Programming Languages. 6 : Haskell Lists. Department of Computer Science University of Arizona

Functional Programming in Haskell for A level teachers

Haskell through HUGS THE BASICS

First Haskell Exercises

A First Look at ML. Chapter Five Modern Programming Languages, 2nd ed. 1

CSCE 314 TAMU Fall CSCE 314: Programming Languages Dr. Flemming Andersen. Haskell Basics

Programming Languages Fall 2013

CPS 506 Comparative Programming Languages. Programming Language Paradigm

This example highlights the difference between imperative and functional programming. The imperative programming solution is based on an accumulator

Shell CSCE 314 TAMU. Haskell Functions

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

About the Tutorial. Audience. Prerequisites. Copyright & Disclaimer. Haskell Programming

Title: Recursion and Higher Order Functions

Chapter 15. Functional Programming Languages

About the Tutorial. Audience. Prerequisites. Copyright & Disclaimer. Haskell Programming

Logical Methods in... using Haskell Getting Started

3. Functional Programming. Oscar Nierstrasz

CSc 372. Comparative Programming Languages. 4 : Haskell Basics. Department of Computer Science University of Arizona

Topic 1: Introduction

CSc 372 Comparative Programming Languages. 4 : Haskell Basics

Functional Programming in Haskell Part I : Basics

Higher Order Functions in Haskell

Programming Paradigms and Languages Introduction to Haskell. dr Robert Kowalczyk WMiI UŁ

Functional Programming Languages (FPL)

Concepts of Programming Languages

Background Type Classes (1B) Young Won Lim 6/28/18

CSc 372 Comparative Programming Languages

Programming Paradigms

Haskell Refresher Informatics 2D

CSCE 314 Programming Languages. Interactive Programming: I/O

Lecture 19: Functions, Types and Data Structures in Haskell

PROGRAMMING IN HASKELL. Chapter 2 - First Steps

GHCi: Getting started (1A) Young Won Lim 6/3/17

Functional Programming. Pure Functional Languages

Functional Programming. Pure Functional Languages

CS457/557 Functional Languages

PROGRAMMING IN HASKELL. Chapter 5 - List Comprehensions

Functional Programming

Programming Paradigms

SML A F unctional Functional Language Language Lecture 19

According to Larry Wall (designer of PERL): a language by geniuses! for geniuses. Lecture 7: Haskell. Haskell 98. Haskell (cont) - Type-safe!

CS 440: Programming Languages and Translators, Spring 2019 Mon 2/4

Haskell Syntax in Functions

Thoughts on Assignment 4 Haskell: Flow of Control

Functional Programming and Haskell

HIGHER-ORDER FUNCTIONS

CSCE 314 Programming Languages

Summer 2017 Discussion 10: July 25, Introduction. 2 Primitives and Define

Programming with Math and Logic

GHCi: Getting started (1A) Young Won Lim 5/31/17

INTRODUCTION TO FUNCTIONAL PROGRAMMING

Lecture 2: List algorithms using recursion and list comprehensions

Introduction to Python and programming. Ruth Anderson UW CSE 160 Winter 2017

Recursion and Induction: Haskell; Primitive Data Types; Writing Function Definitions

Functional Languages. Hwansoo Han

Functional Programming for Logicians - Lecture 1

Introduction. chapter Functions

Haskell: From Basic to Advanced. Part 2 Type Classes, Laziness, IO, Modules

Learn You a Haskell for Great Good!

Week 1: Introduction to R, part 1

Intro to Haskell Notes: Part 5

Pace University. Fundamental Concepts of CS121 1

Standard prelude. Appendix A. A.1 Classes

GHCi: Getting started (1A) Young Won Lim 5/26/17

PL Categories: Functional PLs Introduction to Haskell Haskell: Functions

Defining Functions. CSc 372. Comparative Programming Languages. 5 : Haskell Function Definitions. Department of Computer Science University of Arizona

A tour of the Haskell Prelude

CSCE 314 Programming Languages

Intermediate Algebra. Gregg Waterman Oregon Institute of Technology

Functional Logic Programming Language Curry

Background Operators (1E) Young Won Lim 7/7/18

G Programming Languages - Fall 2012

CSC 533: Programming Languages. Spring 2015

Monad Background (3A) Young Won Lim 11/18/17

Functional Programming. Big Picture. Design of Programming Languages

Monad Background (3A) Young Won Lim 10/5/17

Transcription:

PP 2017/18 Unit 11 Functional Programming with Haskell 1/37 Programming Paradigms Unit 11 Functional Programming with Haskell J. Gamper Free University of Bozen-Bolzano Faculty of Computer Science IDSE

PP 2017/18 Unit 11 Functional Programming with Haskell 2/37 Outline 1 Basic Concepts 2 Lists and Tuples 3 Basics of Haskell s Type System 4 Modules

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 3/37 Outline 1 Basic Concepts 2 Lists and Tuples 3 Basics of Haskell s Type System 4 Modules

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 4/37 Background Now we ll study a purely functional programming language: Haskell Was developed in 1990 by a committee of experts combining the best features of existing functional programming languages Named after the American mathematician and logician Haskell Curry Haskell is a statically and strongly typed, compiled, pure functional programming language Not very surprisingly, the centerpiece of Haskell are functions that have input parameters and compute a result

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 5/37 Referential Transparency Referential transparency is a useful property of pure functional languages: functions return the same output, given the same input functions do not have side effects, i.e., they do not modify program state a variable can only be assigned (matched) a value once within a scope or program execution Haskell supports referential transparency

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 6/37 Advantages of Referential Transparency Allows a compiler to figure out a program s behavior more easily Allows a programmer to show correctness of the code more easily Helps in building correct programs by putting together smaller, correct functions, that always behave in the same way Allows Haskell to do lazy evaluation: it will not compute anything until the result is actually needed For example, an infinite data structure is not a problem (as long as you don t try to access all of it!)

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 7/37 What Do the Experts Say?/1 Functional programming is considered an elegant style of programming

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 8/37 What Do the Experts Say?/2 It is considered to be a bit academic, though

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 9/37 Functional Programming in Practice The functional style of programming is applied in practice There are users in the financial industry Mainly for building complex models More details are provided here: http://www.haskell.org/haskellwiki/haskell_in_industry Unreal Engine 4 is a software framework (game engine) designed for the creation and development of video games Has taken functional programming concepts on board, e.g. see here: http://graphics.cs.williams.edu/archive/sweeneyhpg2009/timhpg2009.pdf Purists would disagree, as the engine is written in C++, but functional concepts are applied

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 10/37 Starting the Interpreter Although Haskell is usually compiled, there is also an interactive interpreter To start the interpreter in Linux, open a console and type ghci The GHC interpreter prompt > shows up, which means that the interpreter is ready to evaluate an expression Here are a few arithmetic expressions > 2+3*4 14 > (2+3)*4 20 > sqrt (3^2 + 4^2) 5.0

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 11/37 Hello World Let s write a Hello, world! program in Haskell Prelude> "Hello, World!" "Hello, World!" The Haskell system evaluated the string, and printed the result, which is the string itself. We can try a variation to print directly to standard output Prelude> putstrln "Hello World" Hello World Later we will see how to make an exectuable Hello World program

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 12/37 Haskell is Strongly Typed Haskell is a strongly typed language, it doesn t like you to mix types > 5 + 3 8 > 5 + "string" <interactive>:8:3:... some lengthy error message... However, in some situations types can be inferred > 2 + 3.5 5.5

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 13/37 Variables Variables in Haskell begin with a lower-case letter > a = 5 <interactive>:1:3: parse error on input = To assign a value to a variable in the shell, you have to use the function let > let a = 5 > a 5 let binds the value 5 to the variable a in the local scope (i.e., the console)

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 14/37 Using Functions min and max are two built-in functions with the obvious meaning When calling functions, parameters are not enclosed in parentheses, you just list them > min 8 12 8 Functions can be nested inside each other Parentheses are used to indicate precedence > max (min 8 12) (min 3 7) 8

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 15/37 Writing Your Own Functions/1 When defining a function of your own in the console, you have to use the function let similar as we did for variable assignments Then, you have to provide the following parts: The name of the function A list of parameters The symbol = The actual definition (body) of the function > let doubleme x = x + x > doubleme 8 16 The = separates the head of the function from the body of the function, which specifies the actual definition of the function The head is also called signature

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 16/37 Writing Your Own Functions/2 If you want to double two numbers and add them, you could start from scratch let doubleus x y = x * 2 + y * 2 However, it is good (functional) programming style to re-use correct code let doubleus x y = (doubleme x) + (doubleme y)

Basic Concepts PP 2017/18 Unit 11 Functional Programming with Haskell 17/37 Conditionals Conditionals are functions in Haskell, so they always have to return something: > let doublesmallnumber x = if x > 100 then x else x*2 Writing statements spanning more than one line in the shell can be a bit of a pain > :{ let { doublesmallnumber x = if x > 100 ;then x ;else x*2} :}

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 18/37 Outline 1 Basic Concepts 2 Lists and Tuples 3 Basics of Haskell s Type System 4 Modules

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 19/37 Lists/1 Haskell also supports lists with the standard square bracket notation > let numberlist = [1,2,3] All elements of a list have to be of the same type The head and the tail of a list can be obtained by the operator : [] represents the empty list > let a:b = numberlist > a 1 > b [2,3] Internally, a list [1] is represented as 1:[] Notice the similarity to Prolog lists that are represented as structures

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 20/37 Lists/2 You can also extract more than one elements from a list: > let a:b:c = numberlist > a 1 > b 2 > c [3] The : operator can also be used to construct new lists > 10:[11,12] [10,11,12] Another way is to concatenate two lists with the operator ++ > [1] ++ [2,3] [1,2,3]

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 21/37 Lists/3 Alternatively, you can call the functions head and tail > head numberlist 1 > tail numberlist [2,3] There are also functions to take and drop the first n elements of a list > take 2 numberlist [1,2] > drop 2 numberlist [3] There is a large number of other built-in list functions

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 22/37 Infinite Lists You can also create an infinite list! > let naturalnumbers = [1..] > take 5 naturalnumbers [1,2,3,4,5] This works since Haskell is lazy, i.e., Haskell won t execute functions and calculate things until it s really forced to show you a result, e.g., the first five numbers.

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 23/37 Ranges Similar to Ruby, you can create lists of numbers in a certain range > [1..10] [1,2,3,4,5,6,7,8,9,10] You can also skip some numbers or count backwards: > [2,4..20] [2,4,6,8,10,12,14,16,18,20] > [10,7..1] [10,7,4,1]

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 24/37 List Comprehensions/1 Set comprehension is a mathematical way of defining specific sets, given a more general set For example, the first ten even natural numbers can be defined by S even10 = {2x x N,x 10} Set comprehensions are usually described by an output function (here 2x) a variable (here x) an input set (here N) a predicate (here x 10)

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 25/37 List Comprehensions/2 In Haskell this concept can be applied to lists, called list comprehension Allows you to generate lists that are too complex for ranges For example, out of the first five odd natural numbers, we want those whose square is not equal to 25 [ x x <- [1,3..9], (x*x) /= 25 ] <- stands for (or is interpreted as drawn from ) The above list comprehension will output [1,3,7,9]

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 26/37 Tuples Haskell also knows tuples, which are enclosed in round brackets: (1,"one","uno") Unlike lists, tuples can combine different data types in the same tuple Similar to Prolog structures, except that there is no functor Tuples can also be nested (1, ("one", "EN"), ("uno", "IT"))

Lists and Tuples PP 2017/18 Unit 11 Functional Programming with Haskell 27/37 Combining Tuples and Lists Consider a triangle in the Euclidean space, which is represented by 3 points; each point is represented by a tuple The following list comprehension flips the triangle along the diagonal > [(y,x) (x,y) <- [(1,2), (2,3), (3,4)]] [(2,1), (3,2), (4,3)] This list comprehension has no condition, which means that it is always true Shift the triangle horizontally > [(4-x,y) (x,y) <- [(1,2), (2,3), (3,4)]] [(3,2), (2,3), (1,1)]

Basics of Haskell s Type System PP 2017/18 Unit 11 Functional Programming with Haskell 28/37 Outline 1 Basic Concepts 2 Lists and Tuples 3 Basics of Haskell s Type System 4 Modules

Basics of Haskell s Type System PP 2017/18 Unit 11 Functional Programming with Haskell 29/37 Haskell s Type System/1 After mentioning types a few times now, it s time to have a closer look The :t command gives you the type of an expression > :t a a :: Char > :t True True :: Bool > :t "hello!" "hello!" :: [Char] > :t (True, a ) (True, a ) :: (Bool, Char) > :t 4==5 4==5 :: Bool All the major built-in types of other languages are also available in Haskell Types start with an upper-case letter

Basics of Haskell s Type System PP 2017/18 Unit 11 Functional Programming with Haskell 30/37 Haskell s Type System/2 You can also find out the type of functions > :t doubleme doubleme :: Integer -> Integer > :t doubleus doubleus :: Integer -> Integer -> Integer The last type is the return type The others are the type of the input parameters e.g., doubleus has two input parameters of type Integer and returns a value of type Integer

Basics of Haskell s Type System PP 2017/18 Unit 11 Functional Programming with Haskell 31/37 Type Variables Let s look at more subtle typing issues For example, what is the type of the function head? The function head can be applied to lists of different types > :t head head :: [a] -> a a is a type variable, i.e., a can be of any type So, the head function accepts a list of any type a and returns a single element of the same type a

Basics of Haskell s Type System PP 2017/18 Unit 11 Functional Programming with Haskell 32/37 Type Classes/1 In Haskell, types are organized in type classes Let s look at the type of the comparison operator? > :t (==) (==) :: Eq a => a -> a -> Bool The symbol => is called a type constraint The left-hand side represents that type variable a has to be a member of type class Eq The right-hand side is the type specification of the function == two arguments of a type that is a member of the type class Eq and a boolean return type Haskell supports a couple of type classes, e.g., Ord for types that have ordering Num for types that have numerical values

Basics of Haskell s Type System PP 2017/18 Unit 11 Functional Programming with Haskell 33/37 Type Classes/2 Type classes are similar to interfaces They tell you what kind of functions a type supports For example, types belonging to the type class Num support all the standard mathematical operators: +, -, *, /,... Show converts values to strings Read is the opposite: takes a string and converts it to a value

Modules PP 2017/18 Unit 11 Functional Programming with Haskell 34/37 Outline 1 Basic Concepts 2 Lists and Tuples 3 Basics of Haskell s Type System 4 Modules

Modules PP 2017/18 Unit 11 Functional Programming with Haskell 35/37 Writing Modules Let s start with some proper programming and define code in a module The code below shows a complete module MyModule, which we store in a file MyModule.hs module MyModule ( doubleme ) where doubleme :: Integer -> Integer doubleme x = x + x Module names start with an upper-case letter and lists the functions that are exported The last two lines are the function definition: the first line specifies the type of the function doubleme, the second line defines the function itself Note that the function let is not required inside modules

Modules PP 2017/18 Unit 11 Functional Programming with Haskell 36/37 Compiling and Using Modules You can load the file MyModule.hs into the interpreter with the :l function > :l MyModule [1 of 1] Compiling MyModule ( MyModule.hs, interpreted ) Ok, modules loaded: MyModule. *MyModule> Now you can use the functions defined in the module > doubleme 2 4 Alternatively, you can also compile the module using the OS command ghc and then load the compiled version with :l as above

Modules PP 2017/18 Unit 11 Functional Programming with Haskell 37/37 Importing other Modules If you want to re-use code from a module in another module, you can import it module YAM ( doubleus ) where import MyModule doubleus :: Integer -> Integer -> Integer doubleus x y = (doubleme x) + (doubleme y)