Inleiding tot Func.oneel Programmeren les 3



Vergelijkbare documenten
Inleiding tot Func.oneel Programmeren

FUNCTIONEEL PROGRAMMEREN WEEK 1

Verzamelingen, Lijsten, Functioneel Programmeren

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

Haskell: programmeren in een luie, puur functionele taal

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

Verzamelingen, Lijsten, Functioneel Programmeren

Verzamelingen, Lijsten, Functioneel Programmeren

OEFENINGEN PYTHON REEKS 1

Modelleren en Programmeren

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

OEFENINGEN PYTHON REEKS 1

Vakgroep CW KAHO Sint-Lieven

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

Programmeren in Java les 3

Geavanceerde Programmeertechnologie. Prof. dr. Kris Luyten Jo Vermeulen

1 Inleiding in Functioneel Programmeren

Een korte samenvatting van enkele FORTRAN opdrachten

OEFENINGEN PYTHON REEKS 1

Modelleren en Programmeren

Programmeren met Arduino-software

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

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Modelleren en Programmeren

Tentamen Programmeren in C (EE1400)

SQL datadefinitietaal

Datastructuren Werkcollege Intro

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

Tentamen Programmeren in C (EE1400)

PYTHON REEKS 1: BASICS. Mathias Polfliet

Elementary Data Structures 3

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

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

Functioneel programmeren met Helium

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Modelleren en Programmeren

Programmeren en Wetenschappelijk Rekenen in Python. Wi1205AE I.A.M. Goddijn, Faculteit EWI 22 april 2014

6,1. Samenvatting door een scholier 1809 woorden 28 oktober keer beoordeeld. Informatica

Talstelsels en getalnotaties (oplmodel)

Functioneel Programmeren met Clean

Datastructuren: stapels, rijen en binaire bomen

Java Programma structuur

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

Programmeren in Java 3

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

Opgave 5 Equationeel programmeren

Functioneel programmeren

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

2IA05 Functioneel Programmeren

Datastructuren en algoritmen

Inleiding Programmeren 2

17 Operaties op bits Bitoperatoren en bitexpressies

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

Samenvatting hst. 3 sec. 1-3

Planning. 1. Mini College. 2. Introductiecursus Imperatief Programmeren. 3. Crash and Compile (vanaf 17:00 uur)

Functioneel Programmeren

Modulewijzer Tirdat01

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Functioneel Programmeren

Een gelinkte lijst in C#

Online c++ leren programmeren:

Ontwerp van Informatiesystemen

Thinking of Development

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

Opmerkingen en vragen aan Ultieme vraag: Hoe beïnvloedt dit de winstkansen?

Objectgericht programmeren 1.

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

Lab Webdesign: Javascript 3 maart 2008

extra oefening algoritmiek - antwoorden

Vorig jaar in 5v cluster, tot en met OO hoofdstukken, geen problemen. Nu in mengcluster, tot OO hoofdstukken, wel problemen bij 4h leerlingen

Succes! Theo DʼHondt 13 juni 2010

Zelftest Inleiding Programmeren

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

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Arrays. Complexe datastructuren. Waarom arrays. Geen stijlvol programma:

Programmeren in C++ Efficiënte zoekfunctie in een boek

Hoofdstuk 2. Week 4: Datastructuren. 2.1 Leesopdracht. 2.2 Bomen. 2.3 Definitie

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

Programmeermethoden. Functies vervolg. Walter Kosters. week 5: 1 5 oktober kosterswa/pm/

Arduino Zuid-Limburg Workshop 2

Probleem met dobbelspel. 2IP05: Programmeren Blok A. 5 spelers,2 dobbelstenen. wstomv/edu/2ip05/ Per ronde werpt elke speler 1

Inleiding Programmeren 2

De standaard programmeertaal

GEDETAILLEERDE INHOUD

Modelleren en Programmeren

Modelleren en Programmeren

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

Transcriptie:

Inleiding tot Func.oneel Programmeren les 3 Kris Luyten, Jo Vermeulen {kris.luyten,jo.vermeulen}@uhasselt.be Exper.secentrum voor Digitale Media Universiteit Hasselt

Currying Currying: een func.e met meerdere parameters omzenen naar verschillende func.es met telkens 1 parameter f x y = z (f x) y = z f x = \y - > z ((f x) y) = z f = \x - > \y - > z f: (X Y) Z f: X (Y Z)

Currying Som :: (Int,Int)- >Int kan Som :: Int- >Int- >Int worden Som 5 6 is een func.e, maar Som 5 kan evengoed gebruikt worden als argument voor een andere func.e (bijv. de map func.e) Func.es worden beter herbruikbaar - Par.ële func.es als argument - Func.es samenstellen (f en g wordt f.g)

Leg uit/vul aan mysteryf = foldl (flip (:)) []!

Extreme Haskell twisted_fac.hs fac :: Int -> Int! fac n = foldr (*) 1 [1..n]!! main = print (map (fac) [3,4,5,6,7,8])!

Extreme Haskell lazy_primes.hs primes = sieve [2..]! sieve (h:t) = h : sieve [x!!!!!!!!!x <- t, x `mod` h /= 0]!! main = do! putstrln "Geef een geheel getal:"! nummer <- getline! print (take (read nummer) primes)!

Extreme Haskell lazy_fibo.hs lfibo :: [Int]! lfibo = 0 : 1 : zipwith (+) lfibo (tail lfibo)!! main = do! putstrln "Enter a number: "! n <- getline! print (take (read n) lfibo)!

Evalua.estrategiëen

Evalua.e Strategie Op welke manier wordt een expressie geëvalueerd? De manier waarop argumenten van een func.e worden geëvalueerd bij een func.e- oproep. Strikte versus niet- strikte evalua.e Strikt: parameters func.e wordt geëvalueerd voor uitvoering func.e Niet- strikt: parameters func.e worden niet geëvalueerd tenzij deze gebruikt worden. Evalua.e van de parameters gebeurt dan niet noodzakelijk voor de uitvoering van de func.e

Strikte evalua.e Call- by- Value: parameter expressies worden geëvalueerd en toegekend aan een variabele naam (copy!) voor uitvoering func.e. Func.e aanroep:!int i=3;!!bereken(i);! Func.e def:!int bereken(int j){!!!j = j + j*2;!!!return j;!!};! Java, ML, Scheme, C, Pascal,

Strikte evalua.e Call- by- Reference: : parameter expressies worden geëvalueerd en een variabelenaam verwijst naar de waarde (referen.e naar geheugen!) voor uitvoering van de func.e. Func.e aanroep:!int i=3;!!bereken(i);! Func.e def:!int bereken(int& j){!!!j = j + j*2;!!!return j;!!}! Func.e aanroep:!int i=3;!!bereken(&i);! Func.e def:!int bereken(int* j){!!!*j = *j + (*j)*2;!!!return *j;!!}!

Niet- strikte evalua.e Call- by- Name: iedere verwijzing naar de expressie wordt vervangen door de expressie zelf. De expressie wordt opnieuw geëvalueerd bij elk gebruik ervan. Func.e aanroep:!a[0]=3; a[1]=14;!!int i =0;!!bereken(a[i],&i);!! Func.e def:!int bereken(int l, int i){!!!l = l+1;!!!i = i+1;!!!l = l-1!!!return l;!!}!

Niet- strikte evalua.e Call- by- Name: iedere verwijzing naar de expressie wordt vervangen door de expressie zelf. De expressie wordt opnieuw geëvalueerd bij elk gebruik ervan. Func.e aanroep:!a[0]=3; a[1]=14;!!int i =0;!!bereken(a[i],&i);!! Func.e def:!int bereken(int a[i], int i){!!!a[i] = a[i]+1;!!!i = i+1;!!!a[i] = a[i]-1!!!return a[i];!!}! Zelden of nooit ondersteund in de meeste programmeertalen. Algol60 is de bekendste taal die call- by- name implementeert.

Niet- strikte evalua.e Call- by- Need: werkt zoals call- by- name maar na de eerste evalua.e wordt die waarde verder gebruikt. In pure func.onele programmeertalen is het effect hetzelfde als call- by- name en wordt vaak Lazy Evalua.on genoemd. plus14 x y = x+x! plus14 (2*3) (4-2)!! Haskell implementeert call- by- need. Verschillende andere talen ondersteunen deze seman.ek ook, naast call- by- value: D, Scheme, Nemerle, Python,

Data Types

Types Karakters en Strings Numerieke types: Integer, Float, Boolean: True en False Logische en: &&, logische of: en nega.e: not Polymorfe types a Worden afgeleid door Haskell zelf Types makkelijk uitbreidbaar dankzij type classess

console Types :t vraagt het type op in de interac.eve shell $> ghci! Prelude> :t 42! 42 :: (Num t) => t! Prelude> :t "Hallo"! "Hallo" :: [Char]! Prelude> :t 3.1415! 3.1415 :: (Fractional t) => t! Prelude> :t x! Prelude> :t [1,2,45]! [1,2,45] :: (Num t) => [t]! Prelude> :t [1,2,45.4]! [1,2,45.4] :: (Fractional t) => [t]! Prelude> :t ["hallo", "h"]! ["hallo", "h"] :: [[Char]]! Prelude> :t ['h','a','l','l','o']! ['h','a','l','l','o'] :: [Char]!!

Data Types Haskell laat user defined datatypes toe Bron: Real World Haskell van Bryan O'Sullivan, Don Stewart en John Goerzen - hnp://book.realworldhaskell.org/ read/defining- types- streamlining- func.ons.html data BookInfo = Book Int String [String]! typenaam constructor component types

Data Types Haskell laat user defined datatypes toe Bron: Real World Haskell van Bryan O'Sullivan, Don Stewart en John Goerzen - hnp://book.realworldhaskell.org/ read/defining- types- streamlining- func.ons.html data Book = Book Int String [String]! typenaam constructor component types kunnen hetzelfde zijn

Data Types data BookInfo = Book Int String [String]! data MagazineInfo = Magazine Int String [String]! Book 42 The Hitchhikers Guide to the Galaxy Douglas Adams!

Algebraic Data Types data Bool = True False! Meerdere constructors Alternatives of cases

Algebraic Data Types billinginfo.hs type CustomerID = Int! type CardHolder = String! type CardNumber = String! type Address = [String]! data BillingInfo =!!CreditCard CardNumber CardHolder Address! CashOnDelivery! Invoice CustomerID!! deriving (Show)! type definieert synoniem

Currying and Algebraic Data Types Prelude> :load billinginfo.hs! [1 of 1] Compiling Main ( billinginfo.hs, interpreted )! Ok, modules loaded: Main.! *Main> :type CreditCard! CreditCard :: CardNumber -> CardHolder -> Address -> BillingInfo!! CreditCard Cardnumber (CreditCard Cardnumber) CardHolder ((CreditCard Cardnumber) CardHolder) Address ((CreditCard Cardnumber) CardHolder) Address = BillingInfo

Parameterised Types Zelf lezen: hnp://book.realworldhaskell.org/read/ defining- types- streamlining- func.ons.html#detypes.paramtypes Leg uit hoe Maybe polymorfisme ondersteunt voor zelfgedefinieerde datatypes

Recursive Types data List a = Cons a (List a)!! Nil! deriving (Show)!

Recursive Types data List a = Cons a (List a)!! Nil! deriving (Show)!

Recursive Types data List a = Cons a (List a)!! Nil! deriving (Show)! :! []!!

Recursive Types data List a = Cons a (List a)! Nil! deriving (Show)!! llzip Nil _ = Nil! llzip _ Nil = Nil! llzip (Cons x xs) (Cons y ys) =!!!!!!!Cons (x,y) (llzip xs ys)!! llconvert (x:xs) = Cons x (llconvert xs)! llconvert [] = Nil!! main = print ( llzip (llconvert [2,3,7,5])! (llconvert [1,0,4,8,37]))!

Oefeningen (Her)schrijf de map en filter func.es voor List Herneem de volgende oefeningen met deze datastructuur: rotate, draaiom, fibonacci

Recursive Types: Trees data Tree a = Node a (Tree a) (Tree a)!!!!!! Empty!!!!!! deriving (Show)!

Oefeningen Schrijf een programma dat enkele binaire bomen definieert (handma.g) Schrijf een func.e die het aantal nodes telt in de boom Schrijf een programma die opzoekt of een element in de boom aanwezig is of niet Schrijf een programma dat de hoogte van de boom berekent (lengte grootste pad root- >blad)

Oefeningen (ietsje moeilijker) Schrijf een func.e die checkt of de boom gebalanceerd is Kan je een programma schrijven dat alle mogelijke subtrees van de tree teruggeet?