Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE...

44
Funktsionaalne Programmeerimine Varmo V ENE Arvutiteaduse Instituut Tartu Ülikool EMAIL : [email protected] WWW: http://www.cs.ut.ee/~varmo/FP/ LIST: [email protected]

Transcript of Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE...

Page 1: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

Funktsionaalne Programmeerimine

Varmo VENE

Arvutiteaduse Instituut

Tartu Ülikool

EMAIL : [email protected]

WWW: http://www.cs.ut.ee/~varmo/FP/

LIST: [email protected]

Page 2: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Kursuse plaan

• Ülevaade keelest Haskell

• λ-arvutus

– Reduktsioon, Church-Rosseri teoreemid

– Kombinaatorloogika

– Arvutatavus, Churchi tees

• Tüübiteooria elemendid

– Tüübitudλ-arvutus, Curry-Howard isomorfism

– 2-järku loogikad, polümorfneλ-arvutus

– Hindley-Milneri tüübisüsteem

VARMO VENE 2

Page 3: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Kirjandus

1. P. Hudak.The Haskell School of Expression. Cambridge University

Press, 2000.

2. R. L. Page.Two Dozen Short Lessons in Haskell. Uni. of Oklahoma,

1997.

3. C. Hankin.Lambda Calculi - A guide for computer scientists. Oxford

University Press, 1994.

VARMO VENE 3

Page 4: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Programmeerimiskeelte paradigmad

VARMO VENE 4

Page 5: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Programmeerimiskeelte paradigmad

• Imperatiivsed keeled

– Protseduursed keeled — Fortran, Pascal, C, Ada

– Objektorienteeritud keeled — Smalltalk, C++, Java

VARMO VENE 4

Page 6: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Programmeerimiskeelte paradigmad

• Imperatiivsed keeled

– Protseduursed keeled — Fortran, Pascal, C, Ada

– Objektorienteeritud keeled — Smalltalk, C++, Java

• Deklaratiivsed keeled

– Funktsionaalsed keeled — Scheme, ML, Haskell

– Loogilised keeled — Prolog, Parlog, Gödel, Mercury

VARMO VENE 4

Page 7: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Funktsionaalsete keelte põhiomadused

VARMO VENE 5

Page 8: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Funktsionaalsete keelte põhiomadused

• Puudub programmi oleku mõiste

– Puuduvad kõrvalefektid, muutujad

– Ilmutatud viidatavus(referential transparency)

VARMO VENE 5

Page 9: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Funktsionaalsete keelte põhiomadused

• Puudub programmi oleku mõiste

– Puuduvad kõrvalefektid, muutujad

– Ilmutatud viidatavus(referential transparency)

• Rikkad abstraksiooni vahendid

– Andmeabstraktsioon, näidiste sobitamine

– Kõrgemat-järku funktsioonid

– Laisk väärtustamine

VARMO VENE 5

Page 10: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Funktsionaalsete keelte põhiomadused

• Puudub programmi oleku mõiste

– Puuduvad kõrvalefektid, muutujad

– Ilmutatud viidatavus(referential transparency)

• Rikkad abstraksiooni vahendid

– Andmeabstraktsioon, näidiste sobitamine

– Kõrgemat-järku funktsioonid

– Laisk väärtustamine

• Võimas tüübisüsteem

– Staatiline tüübikontroll, tüüpide tuletamine

– Polümorfism (parameetriline, ’ad-hoc’)

VARMO VENE 5

Page 11: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Põhjusi FP õppimiseks

• Erinev lähenemine programmeerimisele

– annab uue vaatenurga tuntud probleemide lahendamiseks

VARMO VENE 6

Page 12: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Põhjusi FP õppimiseks

• Erinev lähenemine programmeerimisele

• FP on “kõrgtaseme” paradigma

– lubab probleeme lahendada väga abstarktsel tasemel

– kergendab vigade leidmist/vältimist

– võit produktiivsuses tihti mitmekordne

VARMO VENE 7

Page 13: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Põhjusi FP õppimiseks

• Erinev lähenemine programmeerimisele

• FP on “kõrgtaseme” paradigma

• Mõju teiste keelte arengule

– automaatne mäluhaldus (Java)

– polümorfism (C++, Ada)

– algebralised andmetüübid (Pizza)

VARMO VENE 8

Page 14: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Põhjusi FP õppimiseks

• Erinev lähenemine programmeerimisele

• FP on “kõrgtaseme” paradigma

• Mõju teiste keelte arengule

• Lihtne semantika

– formaalne keele kirjeldamine

– programmide analüüs

– programmide teisendamine

VARMO VENE 9

Page 15: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Funktsionaalsete keelte puudusi

• Mõnede ülesannete lahendamisel võib omistamine olla vajalik

• Mõnikord me tahame modellerida väliskeskonna olekut

• Kasutajaliidese programmeerimine võib olla keerulisem

• Programmide efektiivsus ei ole mitte alati piisav

• Aja- ja mälukeerukus võib olla raskesti ennustatav

VARMO VENE 10

Page 16: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

FP lühiajalugu

• Kombinaatorloogika (Schönfinkel, H.Curry)

• Lambda-arvutus (A.Church)

• Lisp (J.McCarthy 1958)

• ISWIM (P.Landin 1965)

• FP (J.Backus 1977)

• ML ja polümorfne tüübisüsteem (Milner 1978)

• Hope, Sasl, Miranda, . . . (1980–85)

• Haskell (1988)

VARMO VENE 11

Page 17: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Funktsionaalne keel Haskell

• Lühiajalugu

1987 loodi Haskell’i komitee

1988 esimene keele kirjeldus (v. 1.0)

1999 Haskell98 (Standard Haskell)

• Kodulehekülg:http://www.haskell.org/

• Realisatsioonid:

hugs interpretaator, Portland, Yale

ghc kompilaator, Glasgow

hbc kompilaator, Chalmers

nhc kompilaator, York

VARMO VENE 12

Page 18: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Hugs 98

• Hugs = Haskell Users Gofer System

• http://www.haskell.org/hugs

– Win95/NT, Unix, Linux, . . .

• Käivitamiseks shelli käsurealt:

hugs [options] [file]

• Keskkonna muutujad

setenv HUGSFLAGS ’-E"emacsclient +%d %s"’

VARMO VENE 13

Page 19: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

VARMO VENE 14

Page 20: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Programmi struktuur

– Programm koosneb moodulitest

– Peamooduli nimiMain

– Vaikimisi laaditakse sisse moodulPrelude

VARMO VENE 14

Page 21: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Programmi struktuur

– Programm koosneb moodulitest

– Peamooduli nimiMain

– Vaikimisi laaditakse sisse moodulPrelude

• Mooduli struktuur

– Mooduli päis (mooduli nimi ja eksportlist)

– Deklaratsioonid (impodid, funktsioonide tüübid, . . . )

– Definitsioonid (andmetüüpide, funktsioonide)

VARMO VENE 14

Page 22: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Programmi struktuur

– Programm koosneb moodulitest

– Peamooduli nimiMain

– Vaikimisi laaditakse sisse moodulPrelude

• Mooduli struktuur

– Mooduli päis (mooduli nimi ja eksportlist)

– Deklaratsioonid (impodid, funktsioonide tüübid, . . . )

– Definitsioonid (andmetüüpide, funktsioonide)

• Näide

module Hello (hello) where

hello :: String

hello = "Hello, World!"

VARMO VENE 14

Page 23: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Tüüpide deklareerimine

fname1, fname2, . . . , fnamen :: type

– Ei ole kohustuslik, kuna süsteem suudab tavaliselt ise tüübid

tuletada

– On soovitatav, kuna aitab vastavaid funktsioone dokumenteerida

– Mõningatel juhtudel ei saa süsteem ise hakkama

VARMO VENE 15

Page 24: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Tüüpide deklareerimine

fname1, fname2, . . . , fnamen :: type

– Ei ole kohustuslik, kuna süsteem suudab tavaliselt ise tüübid

tuletada

– On soovitatav, kuna aitab vastavaid funktsioone dokumenteerida

– Mõningatel juhtudel ei saa süsteem ise hakkama

• Tüübideklaratsioonid võivad esineda ka avaldistes

3 * (5 :: Int) + 4

VARMO VENE 15

Page 25: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Tüüpide deklareerimine

fname1, fname2, . . . , fnamen :: type

– Ei ole kohustuslik, kuna süsteem suudab tavaliselt ise tüübid

tuletada

– On soovitatav, kuna aitab vastavaid funktsioone dokumenteerida

– Mõningatel juhtudel ei saa süsteem ise hakkama

• Tüübideklaratsioonid võivad esineda ka avaldistes

3 * (5 :: Int) + 4

• NB! — tüüpide nimed algavad suurte tähtedega, funktsioonide nimed

väikestega

VARMO VENE 15

Page 26: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Funktsioonide defineerimine

fname arg1 . . .argn = expr

– Võrduse vasakpool koosneb funktsiooni nimest ja argumentide

näidistest

– Võrduse parempool koosneb defineerivast avaldisest

VARMO VENE 16

Page 27: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Funktsioonide defineerimine

fname arg1 . . .argn = expr

– Võrduse vasakpool koosneb funktsiooni nimest ja argumentide

näidistest

– Võrduse parempool koosneb defineerivast avaldisest

– Näide - faktoriaal

-- fact1 on defineeritud tingimusavaldise abil

fact1 n = if n == 0 then 1

else n * fact1 (n-1)

VARMO VENE 16

Page 28: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

VARMO VENE 17

Page 29: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

VARMO VENE 17

Page 30: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

VARMO VENE 17

Page 31: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

VARMO VENE 17

Page 32: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

VARMO VENE 17

Page 33: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2

VARMO VENE 17

Page 34: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2 =⇒ if 2 == 0 then 1 else 2∗fact1(2−1)

VARMO VENE 17

Page 35: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2 =⇒ if 2 == 0 then 1 else 2∗fact1(2−1)

=⇒ 2∗fact1 1

VARMO VENE 17

Page 36: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2 =⇒ if 2 == 0 then 1 else 2∗fact1(2−1)

=⇒ 2∗fact1 1

=⇒ 2∗ (if 1 == 0 then 1 else 1∗fact1(1−1))

VARMO VENE 17

Page 37: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2 =⇒ if 2 == 0 then 1 else 2∗fact1(2−1)

=⇒ 2∗fact1 1

=⇒ 2∗ (if 1 == 0 then 1 else 1∗fact1(1−1))

=⇒ 2∗ (1∗fact1 0)

VARMO VENE 17

Page 38: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2 =⇒ if 2 == 0 then 1 else 2∗fact1(2−1)

=⇒ 2∗fact1 1

=⇒ 2∗ (if 1 == 0 then 1 else 1∗fact1(1−1))

=⇒ 2∗ (1∗fact1 0)

=⇒ 2∗ (1∗ (if 0 == 0 then 1 else 1∗fact1(0−1)))

VARMO VENE 17

Page 39: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2 =⇒ if 2 == 0 then 1 else 2∗fact1(2−1)

=⇒ 2∗fact1 1

=⇒ 2∗ (if 1 == 0 then 1 else 1∗fact1(1−1))

=⇒ 2∗ (1∗fact1 0)

=⇒ 2∗ (1∗ (if 0 == 0 then 1 else 1∗fact1(0−1)))

=⇒ 2∗ (1∗1)

VARMO VENE 17

Page 40: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Avaldise väärtustamine (reduktsioon)

– Leitakse funktsiooni defineeriv võrdus

– Avaldis asendatakse võrduse parema poolega

– Formaalsed parameetrid asendatakse tegelike argumentidega

– Kogu protsessi korratakse kuni rohkem ei saa

fact1 2 =⇒ if 2 == 0 then 1 else 2∗fact1(2−1)

=⇒ 2∗fact1 1

=⇒ 2∗ (if 1 == 0 then 1 else 1∗fact1(1−1))

=⇒ 2∗ (1∗fact1 0)

=⇒ 2∗ (1∗ (if 0 == 0 then 1 else 1∗fact1(0−1)))

=⇒ 2∗ (1∗1) =⇒ 2

VARMO VENE 17

Page 41: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Ühe funktsiooni võib defineerimiseks võib kasutada mitut võrdust

VARMO VENE 18

Page 42: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Ühe funktsiooni võib defineerimiseks võib kasutada mitut võrdust

• Väärtustamisel kasutatakse (tekstuaalselt) esimest “sobivat”

VARMO VENE 18

Page 43: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Ühe funktsiooni võib defineerimiseks võib kasutada mitut võrdust

• Väärtustamisel kasutatakse (tekstuaalselt) esimest “sobivat”

{- fact2 on defineeritud näidistega sobitamise abil;

töötab ainult 32bitiste täisarvudega -}

fact2 :: Int -> Int

fact2 0 = 1

fact2 n = n * fact2 (n-1)

VARMO VENE 18

Page 44: Funktsionaalne Programmeeriminevarmo/FP2001/slides/loeng1.pdf · FUNKTSIONAALNE PROGRAMMEERIMINE Kirjandus 1.P. Hudak.The Haskell School of Expression. Cambridge University Press,

FUNKTSIONAALNE PROGRAMMEERIMINE

Haskell

• Ühe funktsiooni võib defineerimiseks võib kasutada mitut võrdust

• Väärtustamisel kasutatakse (tekstuaalselt) esimest “sobivat”

{- fact2 on defineeritud näidistega sobitamise abil;

töötab ainult 32bitiste täisarvudega -}

fact2 :: Int -> Int

fact2 0 = 1

fact2 n = n * fact2 (n-1)

-- fact3 on defineeritud "valvurite" abil

fact3 :: Integer -> Integer

fact3 n | n == 0 = 1

| otherwise = n * fact3 (n-1)

VARMO VENE 18