2IA05 Functioneel Programmeren

Vergelijkbare documenten
2IA05 Functioneel Programmeren

Wat is FP? The Haskell School of Expression. Functies. Types 1+1=2. Iedere expressie (en waarde) heeft een type.

FP-theorie. 2IA50, Deel B. Inductieve definities 1/19. / department of mathematics and computer science

inleiding theoretische informatica practicum 1 deadline woensdag 20 februari 2008 om uur

Semantiek (2IT40) Bas Luttik. HG 7.14 tel.: Hoorcollege 8 (7 juni 2007)

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c

Scala. Korte introductie. Sylvia Stuurman

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Verzamelingen, Lijsten, Functioneel Programmeren

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Haskell: programmeren in een luie, puur functionele taal

Leeswijzer Functioneel Programmeren

Inleiding tot Func.oneel Programmeren les 3

colleges recursieve datastructuren college 9 prioriteit van operatoren prioriteit in recursive descent parser

Syntax- (compile), runtime- en logische fouten Binaire operatoren

1 Inleiding in Functioneel Programmeren

Verzamelingen, Lijsten, Functioneel Programmeren

Verzamelingen, Lijsten, Functioneel Programmeren

Python. Vraag 1: Expressies en types. Vraag 1 b: Types -Ingebouwde functies- Vraag 1 a 3/10/14

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Inleiding Programmeren 2

Datastructuren: stapels, rijen en binaire bomen

equationeel programmeren college 1

Modelleren en Programmeren

Constanten. Variabelen. Expressies. Variabelen. Constanten. Voorbeeld : varid.py. een symbolische naam voor een object.

OEFENINGEN PYTHON REEKS 1

Object Oriented Programming

Inleiding C++ Coding Conventions

Datastructuren en algoritmen

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

OEFENINGEN PYTHON REEKS 1

IMP Uitwerking week 13

Modelleren en Programmeren

Inleiding Programmeren 2

Inleiding Programmeren 2

Honours projecten BSc Informatica: twee voorstellen

Uitleg van de Hough transformatie

Inleiding Programmeren 2

Functioneel programmeren met Helium

OEFENINGEN PYTHON REEKS 1

Datastructuren Werkcollege Intro

Imperatief programmeren. Introductie 9. Leerkern 10. Zelftoets 15. Terugkoppeling 16. Inhoud leereenheid 16

Programmeren in Java les 3

APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN. Onderdeel van SmartProducts

Deel 1: Arduino kennismaking. Wat is een microcontroller, structuur van een programma, syntax,

Overerving & Polymorfisme

Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Wat is scripting?

Een gelinkte lijst in C#

Programmeren in Java 3

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Tweede college algoritmiek. 12 februari Grafen en bomen

Modulewijzer Tirdat01

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Om te kijken of x, y, z samen een driehoek specificeren hoeven we alleen nog maar de driehoeksongelijkheid te controleren: x, y, z moeten voldoen

Modelleren en Programmeren

Een korte samenvatting van enkele FORTRAN opdrachten

Design patterns.

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Informatie. Voorbeeld. Voorbeeld: toegangsprijs

Abstraheren van modellen

FUNCTIONEEL PROGRAMMEREN WEEK 1

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011

Programmeren. Cursus Python

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

Modulewijzer tirprog02/infprg01, programmeren in Java 2

Algoritmiek. 15 februari Grafen en bomen

Functioneel Programmeren

Functioneel Programmeren

Elementary Data Structures 3

Datastructuren: stapels, rijen en binaire bomen

Abstracte klassen & Interfaces


De architect: in spagaat tussen mensen en technische details. Illustratie met een simpel voorbeeld

MINICURSUS PHP. Op dit lesmateriaal is een Creative Commons licentie van toepassing Sebastiaan Franken en Rosalie de Klerk Bambara

PYTHON REEKS 1: BASICS. Mathias Polfliet

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2

Variabelen en statements in ActionScript

Functies (een korte inleiding)

Javascript oefenblad 1

Programmeren in Java 3

Vakgroep CW KAHO Sint-Lieven

Modelleren en Programmeren: Prolog

Programmeermethoden NA

NAAM: Programmeren 1 Examen 29/08/2012

Deel II: Modelleren en software ontwikkeling. Hoofdstuk 7 Software ontwikkeling - Overzicht. Naïeve benadering

APPLICATIEBOUW 2E COLLEGE: ONTWERPEN, GEBRUIKERSINTERFACES, VARIABELEN & EXPRESSIES. Onderdeel van SmartProducts

Inhoudsopgave. Relaties geordend paar, cartesisch product, binaire relatie, inverse, functie, domein, bereik, karakteristieke functies

Ontwerp van Informatiesystemen

Arduino Cursus, Deel 2 Programmeren. Simon Pauw, ZB45, Amsterdam

Leren programmeren in C# Deel 4 - Objectoriëntatie

Zelftest Inleiding Programmeren

Transcriptie:

2IA05 Functioneel Programmeren wk1: Introductie Rik van Geldrop, Jaap van der Woude

Declaratieve programmeerstijl 2/20 2 H C H = A A H I JE A 1 F A H = JEA B, A? = H = JEA B D A M = J. K? JE A A C EI? D J A I J= @ I L A H= @ A HE C E @ A JE @? A? JEA BK? JEA @ A BE EJEA I? A? JEA F HA @ E? = = J @ A BE EJEA I

FP-wetenswaardigheden 3/20 Berust op wiskundige theorie (λ-calculus, herschrijfsysteem). Functies als argument/resultaat mogelijk (first class citizens). Functies met één argument: Currying. Type en Structuur zijn de leidraad bij ontwerp en analyse. Redeneren over programma s/functies d.m.v. equational reasoning: constructie/verificatie/transformatie/executie. Recursie i.p.v. repetitie. Compacte programma s/specificaties. (Haskell) Type-systeem ondersteunt Polymorfie/Overloading. (Haskell) Lazy evaluation.

Notatie en terminologie 4/20 Bij voorkeur de gebruikelijke wiskundige notatie voor functies (met applicatie en compositie als elementaire operaties), maar voor implementatie doeleinden Haskell (herkenbaar aan teletype font ). Applicatie-voorbeeld: een puntsgewijze definitie van kwadrateren wiskunde sqr.x = x x of sqr(x) = x 2 (twice.f).x = f.(f.x) haskell sqr x = x * x twice f x = f (f x) Compositie-voorbeeld: een puntvrije definitie van 4 e -machtsverheffing wiskunde quad = sqr sqr haskell quad = sqr.sqr

Notatie en terminologie 5/20 In dit vak gaan we rekenen met functies. Puntsgewijs, maar ook puntvrij. De belangrijkste operatie hierbij is functie-gelijkheid: Definitie [Extensionaliteit] Voor alle functies f en g met hetzelfde domein geldt f = g x :: f.x = g.x Een andere nuttige operatie heet λ-abstractie: Definitie[λ-abstractie] Als x een variabele is van type X and E een expressie van type Y, dan heet (λx E) een λ-abstractie. Verder geldt en (λx E) X Y (λx E).a = E(x := a) voor alle a X I.h.b. f = λx f.x (simplificatie)

puntsgewijs <-> puntvrij 6/20 Gebruik extensionaliteit en λ-abstractie. Van puntvrij naar puntsgewijs: extensionaliteit: Voor alle x quad.x = (sqr sqr).x = {def compositie } sqr.(sqr.x) Van puntsgewijs naar puntvrij: λ-abstractie en/of extensionaliteit: sqr = λ x x x en

puntsgewijs <-> puntvrij 7/20 (twice.f).x = = { abstractie } f.(f.x) twice.f = λx f.(f.x) = { compositie } twice.f = λx (f f).x = { simplificatie } twice.f = f f = { abstractie } twice = λf f f

Notationele conventies 8/20 Reduceer haakjes door het gebruik van de volgende conventies Applicatie heeft de hoogste prioriteit, dus f g.x = f (g.x) Applicatie associeert naar links, dus f.g.h = (f.g).h Abstractie associeert naar rechts, dus λx λy E = λx (λy E)

Secties: speciale λ-abstracties Zij X Y Z, x X en y Y, dan 9/20 x y Z Door λ-abstractie, bijvoorbeeld over y, ontstaat λy x y Y Z bij vaste x Bij applicaties van deze functie verandert alleen het 2 e argument, i.e (λy x y).a = x a Gebruikelijke afkorting is (x ) sectie van Idem voor ( y)

Curry en uncurry 10/20 Currying is een functietransformatie die de isomorfie X Y Z = X (Y Z) aangeeft. De constructie 1. Bepaal (uit de typering!) een functie, genaamd curry curry : (X Y Z) (X (Y Z)) 2. Bepaal (uit de typering!) een functie, genaamd uncurry uncurry : (X (Y Z)) (X Y Z) 3. Ga na dat curry uncurry = id en uncurry curry = id

Curry en uncurry 11/20 Vanwege de isomorfie is het onbelangrijk welke view op functietypering gekozen wordt. In de wiskunde is een ongecurriede versie gebruikelijk. Bijvoorbeeld + Z Z Z en +.(2, 3) Functionele talen prefereren een gecurriede versie omdat daarbij slechts een argument nodig is om voortgang van evaluatie/programmaexecutie te bewerkstelligen. In Haskell: (+) :: Int -> Int -> Int en (+) 2 3 met verband (+) = curry.+

Type, polymorfie, overloading 12/20 basis 1 unit type (singleton set) samengesteld: Voor typen A en B A B functieruimte A B cartesisch product met projecties π 1 en π 2 A + B disjuncte som met injecties/constructoren in 1 en in 2 Polymorfie Een polymorfe functie is één functie die op verschillende typen kan worden toegepast.voorbeeld: swap.(x, y) = (y, x) Overloading Er is sprake van overloading als er aan verschillende functies dezelfde naam gegeven wordt. De keuze van de juiste definitie wordt gemaakt op grond van beschikbare environment-informatie. Voorbeeld: =

Haskell classes Class: collectie typen die bepaalde overloaded operatoren ondersteunen. 13/20

Classes en instances 14/20 class is te vergelijken met begrip abstract class in OO. Voorbeeld class Eq where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) Een type opnemen in een class door completion van operator-set. Bijvoorbeeld: type Void (i.e.()) opnemen in Eq door de ontbrekende definitie van (==) te geven instance Eq () where () == () = True Let bij class en instance definities op de offside-rule!!

Classes en instances, vervolg 1 15/20 extends -relaties tussen classes. Voorbeeld: class Ord extends class Eq. Haskell weergave via context class (Eq a) => Ord a where (<),(<=),(>),(>=) :: a -> a -> Bool min,max :: a -> a -> a -- definitie van (<) ontbreekt -- defs voor overige operatoren uitgedrukt in (<) (Eq a) => heet de context van Ord Een type opnemen in Ord door completion van Eq, i.e. definitie voor (==) completion van Ord: definitie voor (<)

Classes en instances, vervolg 2 16/20 Multiple extension mogelijk. Bijvoorbeeld: class Real extends class Ord en extends class Num class (Num a, Ord a) => Real a where... Instance definities mogelijk via het systeem (zie Sudoku.hs) (via system) data Stack a =... deriving (Eq,Show) (user-defined) instance (Show a) => Show (Stack a) where show EmptyStk = "-" show (Stk x s) = show x ++ " " ++ show s

17/20 Overige Haskell taal elementen geïllustreerd a.d.h.v. Sudoku programma

Statements 18/20 GEEN Assignment GEEN side-effect Sequentie fc-compositie, regel 126 Alternatief statement if.. then.. else.. regel 75 case.. of.. regel 118 guards regel 83 Repetitie recursie: - constructief, regel 119 - staartrecursief, regel 122 Commentaar - (tot eind regel), regel 5 {- meerdere regels -}!! Offside-rule waar eindigt definitie, regel 113

Definities 19/20 Data/typen (standaard o.a. Int, Integer, Bool, Float) standaardtypen: Int, Integer, Bool, Float,.. type type-synoniem regel 12 data nieuw type + constructoren Stack.hs, regel 77 (new type) GEEN subtypering indien nodig: karakteriserend predikaat P(X) = (X B) WEL (bijv) [ a.. z ] consecutief deel van een geordende verzameling regel 20 Operator/Functie-definities: puntvrij regel 38 puntsgewijs regel 44 + prioriteitsniveau + associatie wijze

en Verder.. 20/20 Afkortingen Lijstcomprehensie regel 28 Pattern-matchen regel 33 Lokale bindingen let regel 113 where regel 66 Encapsulation Module hiding regel.. import regel 3 Compacte code probleem: begrijpend lezen Uitgebreide Prelude