Haskell

Werbung
K08
Haskell
1. GrundlegendeEigenschaften
2. GHCi undGHC
3. Typsystem
teilweisebasiertaufFolienvonGrahamHutton undPhilipWadler
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
2
Haskell Literatur
n
M.Block,A.Neumann:Haskell-Intensivkurs:Ein
kompakterEinstiegindiefunktionaleProgrammierung.
Springer,2011.ISBN:978-3-642-04717-6
Frei/onlineverfügbar:
n
n
B.O'Sullivan,D.Stewart,J.Goerzen:RealWorldHaskell.
FirstEdition.O‘Reilly, 2008.ISBN:978-0-596-514983http://book.realworldhaskell.org/
M.Lipovača:Learn You aHaskell for GreatGood!
No Starch Press,2011.ISBN:978-1-59327-283-8
http://learnyouahaskell.com/
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
3
HistorischerHintergrund
n
Ursprung:
n
n
n
n
λ-Kalkül(A.CHURCH undS.KLEENE – 1930erJahre)
Currying*(HASKELL BROOKS CURRY – 1950erJahre)
LispalsersteProgrammiersprachemitfunktionalen
Eigenschaften(J.MCCARTHY 1958)
Haskell 1.0– (P.HUDAK,J.HUGHES,SIMON P.JONES,P.WADLER
1990);aktuelleVersion:Haskell 2010
*ZuvorschonvonG.FREGE undM.SCHÖNFINKEL beschrieben.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
4
IstFPrelevant?
n
VieleKonzeptederFPfindenEinganginden„Alltag“der
Softwareentwicklungbzw.indieWeiterentwicklung
konventionellerSprachen:
xmonad
PUGSPERL6
Compiler
Projekte,dieinHaskellgeschrieben sind (Auswahl)
GoogleMapReduce
Übersicht:http://www.haskell.org/haskellwiki/Haskell_in_industry
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
5
WarumgeradeHaskell undnicht...
...Erlang,F#,Lisp,ML,O‘Caml,Scheme,Scala,...
n
ReinfunktionaleSprache– „purely functional“
n
UnterdenfunktionalenProgrammiersprachensehrpopulär
n
n
n
CompileralsauchinteraktiveInterpreterverfügbar(z.B.
GlasgowHaskell Compiler ghc undghci)
n
n
n
Grosse MengeanBibliotheken
NichtnurGegenstandderForschung,sondernindustrielleingesetzt
(mansollteesnichtalseine„akademischeSpielwiese“auffassen)
GutebissehrguteLaufzeitperformancewennkompiliert
ToolsfürEntwickler(IDEs,Debugger,Build,Profiler)
EntworfendurcheinKomitee
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
6
WasistFunktionaleProgrammierung?
Allgemeinzusammengefasst:
n Programmierstil(Paradigma)dessengrundlegendeMethodedie
Anwendung vonFunktionen aufderenArgumente ist:
EinProgrammistformuliertalseine(möglicherweiseausvielen
Unterfunktionenzusammengesetzte)Funktion(immath.Sinn),
dessenAusführungderAuswertungdieserFunktionentspricht.
n
EinefunktionaleProgrammiersprache
unterstützt /fördert /erzwingt
diesenProgrammierstil.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
7
Gegenüberstellung
n
Gesucht:SummieredieZahlen1...10!
Funktion
Argument
InC++:
InHaskell:
int sum = 0;
sum [1..10]
for (int i=1; i<=10; i++)
{
sum += i;
}
sum
sum
sum
sum
Imperativ:IteriereüberdieZahlen
1bis10undaddieredieaktuelle
ZahlzurGesamtsumme.
Applikativ:WendedieFunktion
sum aufdieListederZahlen1bis
10an,wobeisum dieFunktionist,
diedieSummeeinerListevon
Zahlenberechnet.
:: Num
[]
[x]
(x:xs)
a
=
=
=
=> [a] -> a
0
x
x + sum [xs]
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
8
Funktionsanwendungund-Komposition
graustufen :: Bild -> Bild
springer :: Bild
graustufen
graustufen springer
spiegeln :: Bild -> Bild
neben :: Bild -> Bild -> Bild
neben (spiegeln springer) (graustufen springer)
graustufen
neben
spiegeln
duplizieren
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
9
NeueFunktionausbestehendenFunktionendefinieren
graustufen
neben
spiegeln
duplizieren
duplizieren :: Bild -> Bild
duplizieren x = neben (spiegeln x) (graustufen x)
duplizieren springer
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
10
Haskell:ZurückzurMathematik
x = x +1
n
n
InHaskell istdies
einerekursive
Definitionvonx.
InderMathematikistdieseinenichtlösbareGleichung.Die
Variablex istfestaneinenWertgebunden;x istnichtveränderbar
(engl.immutable).
InimperativenSprachenistdieseineAnweisung umdenZustand
(BereichimSpeicher)dermitderVariablex assoziiertist– eine
ZahlindiesemFall,dieirgendetwasrepräsentiert,z.B.dasAlter
einerPerson– zuverändern.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
11
Wiederholung:Funktion
f
X
n
Y
InderMathematikisteineFunktion f eineAbbildung,dieein
Elementx einerMengeX eindeutig (abernichtnotwendiger
Weiseeineindeutig)aufeinElementy einerZielmengeY
abbildet.
f : X →Y
n
n
n
Linkstotal,d.h.füralleElementevonX definiert(fallsnicht,dann
nenntmanf einepartielleFunktion).
Rechtseindeutig,d.h.fürjedesElementx ∊ X gibteshöchstensein
Elementiny ∊ Y aufdasx abgebildetwird.
X alsauchY könnenProduktmengen sein:
X = X1 × ... × Xn,
Y = Y1 × ... × Ym (n ≥ 0, m ≥ 1)
wobeiXi,Yj wiederumMengensind,× daskartesischeProduktundn
dieStelligkeit (engl.arity)vonf angibt(z.B.liefertX = A × B × C eine
dreistelligeFunktion,wobeidieArgumenteElementeausA,B,C sind).
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
12
Merke
n
n
Egalwannundegalwof ausgewertet(oderangewendet)
wird,dasErgebnis y ∊ Y istnurdurchdenParameter x ∊ X
bestimmt(anhandderAbbildungsvorschriftdiedurchf
vorgegebenist)undsonstnichts!
Ist f eineFunktionimmathematischenSinn,dannerzeugtsie
keineSeiteneffekte.Dereinzige„Effekt“derAuswertungvon
f istdieBerechnungdesErgebnisy ∊ Y.
n
MitanderenWorten:
n
n
DerDatenfluss – d.h.dieBenutzungvonErgebnissendurchnachgeordnete
Funktionen– istexplizit;esgibtkeineimplizitenEffekte.
Esgibtkeinen„versteckten“(impliziten)Zustand derdasErgebniseiner
Funktionbeeinflusst.DemzufolgekannauchkeinZustanddurcheinen
Funktionsaufrufverändertwerden.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
13
https://xkcd.com/1312
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
14
ReferentielleTransparenz
engl.referential transparency/opaqueness
n
n
n
Iste einAusdruckimmath.funktionalenSinn(z.B.g(f(x),y)),
danniste eindeutigdurchdieArgumente(unddie
Auswertungssemantikdiefüre definiertist)bestimmt;d.h....
...gegebendieArgumente,dannkannmane durchsein
Ergebnisbzw.einenäquivalenten(„leichteren“)Ausdrucke'
ersetzen(substituieren)
DieseEigenschaft bezeichnetmanalsreferentielleTransparenz
à Formalermathematisch/logischerBeweisderKorrektheiteines
Programms(liefertesdaswasessoll)wirddadurchvereinfacht
bzw.überhaupterstmöglich,dakeineSeiteneffektemit
einbezogenwerdenmüssen.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
15
Momentmal,wiekannmandann...
n
...folgendeDinge*inHaskell (bzw.reinfunktionalen
Programmiersprachen)realisieren:
n
random() – erzeugteineZufallszahl keineFunktionenimmath.Sinn
n
getInput() – lieferteinüberdieTastatureingegebenesZeichen
n
currentTime() – liefertdieaktuelleUhrzeit/dasaktuelleDatum
n
queryGoogleFor(x) – liefertSuchergebnissefürStichwortx
*AndieserStelleseiabsichtlichnichtderBegriffFunktion(bzw.Funktionalität)verwendet.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
16
Momentmal,wiekannmandann...
n
Haskell bedientsichhierfürderMonoide, Morphismen undFunktoren,
welcheKonzepteausderKategorientheoriederMathematiksind:
n
Action – monadische Funktion(„unreine“FunktionmitSeiteneffekten)
n
Arrow – Verkettung/KompositionvonActions
n
Monad – StrukturausActions;bestimmtwieAktionenausgeführtwerden.
Quelle:
wiki.haskell.org
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
17
FunktionhöhererOrdnung
n
...isteineFunktionbeidereinodermehrereArgument(e)und/oder
dasErgebniswiederumeineFunktionsind.
n
n
n
(X → Y ) → Z
Funktionen,genausowieArgumente,sind„first-classcitizens“
HauptanwendungliegtinderAbstraktionvonmehrerenFunktionen
aneinemOrt.
Beispiele(informell):
n
n
n
EineFunktiondieeineListevonZahlenunddieQuadrat-Funktionals
Argumentehat,dieaufjedeZahldieQuadrat-Funktionanwendetunddie
soentstandeneListederQuadratzahlenzurückgibt.
EineFunktiondieeineListevonZahlenunddieMaximum-Funktionals
Argumentehat,diesukzessivdieMaximum-FunktionaufjezweiZahlen
anwendetumdadurchdengrösstenWertderListezufinden.
EineFunktion,die,gegebeneinedifferenzierbareFunktionf,derenerste
Ableitungf ' alsErgebnisliefert(analytischoderdurchnumerischeApprox.).
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
18
Bedarfsauswertung
engl.lazy evaluation,call-by-need
n
ReferentielleTransparenzermöglichtBedarfsauswertung...
n
n
n
n
...daeskeineRollespieltobdasErgebniseinerFunktionbeijedemAufruf
immer(inaufwändigerWeise)berechnetwird,odererstdann,wenndas
Ergebniswirklichgebraucht/verwendetwird,d.h....
...einAusdruckwirddannausgewertetwenndaraufzugegriffenwird.
Definition (StrikteFunktion):Seif eineFunktionunde ein
nichtterminierenderAusdruck.f iststrikt gdw.f(e) nichtterminiert.
Haskel istnichtstrikt.WasnichtbenötigtwirdfüreineBerechnung,
wirdniemalsausgewertetwerden.DemzufolgesindAusdrückederen
Auswertungunendlichlanglaufenwürde,oderdienichtvollständig
berechenbarsind(daz.B.fehlerhaft),dieabernicht(komplett)
ausgewertetwerdenmüssen,keinProblem.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
19
Bedarfsauswertung
n
ErmöglichtesunendlicheStrukturenzudeklarierenunddamitzu
arbeiten;z.B.:
n ListeallerpositivenGanzzahlen: [1..]
n
n
UnendlicheListevonEinsen:
ListeallerQuadratzahlen:
Beispiel:
n
(ii)
head
head
head
head
head
head
ones = 1 : ones
squares = map (^2) [1..]
:: [Int] -> Int
-- Funktion welche aus einer
[]
= undefined -- Liste von Integer Zahlen
(x:xs) = x
-- die erste Zahl zurück gibt.
[1..]
-- terminiert und liefert “1”
ones
-dito
squares
-dito
Nachteil:esistu.U.schwierigervorhersagbar,wannbzw.obeine
Ressourcetatsächlichbenutztwird(z.B.Netzwerkzugrifferfolgt).
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
20
WeiterewesentlicheEigenschaften
n
InHaskell (undanderen„rein“funktionalenSprachen)
existierenkeineKontrollstrukturenwiez.B.Schleifen
n
n
n
n
StattdessenwirdRekursionbenutzt
StrengesTypsystem:AlleTypenstatischzurCompilezeit bekannt,
wodurchTypinkompatibilitätenerkennbarsind.
PolymorphesTypsystem:FunktionenkönnenfüreineKlasse
verschiedenerTypenanwendbarsein.
AutomatischeSpeicherverwaltung:keineZeigermanipulation;
keinAnfordernundFreigebenvonSpeicher.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
21
Haskell:Kostproben
DasobligatorischeHello World:
Dateinamenskonvention
hello.hs
module Main where
main :: IO()
main = putStrLn "Hello, World"
f :: Ord a => [a] -> [a]
f []
= []
f (x:xs) = f ys ++ [x] ++ f zs
where
ys = [a | a <- xs, a <= x]
zs = [b | b <- xs, b > x]
?
f :: Ord a => [a] -> [a]
f []
= []
f (x:xs) = f [a | a<-xs, a<=x] ++ [x] ++ f [b | b<-xs, b>x]
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
22
SchlüsselwörterinHaskell
SchlüsselwörterinHaskell
as
case
of
class
data
default
deriving
deriving instance
do
data family
forall
foreign
hiding
import
data instance
if
then
else
instance
let
in
infix
infixl
infixr
mdo
module
newtype
proc
qualified
rec
type
type family
type instance
where
NurinbestimmtenKontextreserviert.KannandernortsalsFunktions- bzw.
Variablen-Namebenutztwerden.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
K08
Haskell
1. GrundlegendeEigenschaften
2. GHCi undGHC
3. Typsystem
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
24
GHCi – Interaktiver HaskellInterpreter
n
n
GlasgowHaskell Compiler (GHC)kannalsdieReferenzimplementierung vonHaskell betrachtetwerden.Wirdaucham
häufigstenbenutzt.
GHCi isteininteraktiverInterpreterzumTesten(Scrapbook)
n
Startendurchghci
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
25
GHCi – einfacheAusdrückeauswerten
n
> istderEingabeprompt;zeigtan,dassGHCi bereitzum
AuswertenvonAusdrückenist.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
26
Prelude– dieStandardbibliothek
n
Prelude.hs isteineBibliothek(genauergesagteinmodule)
welcheperDefaultzurVerfügungsteht.
n
Bietetzahlreiche,grundlegendeFunktionenundDatentypenan
> compare 2 3
LT
-- Relation zweier Elemente aus Menge
-- mit definierter Ordnung (LT, GT, EQ)
> head [1,2,3,4,5]
1
-- erstes Element einer Liste
-- analog liefert tail die Restliste
> [1,2,3,4,5] !! 2
3
-- n-tes Element einer Liste
> take 3 [1,2,3,4,5]
[1,2,3]
-- ersten n Elemente einer Liste
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
27
Prelude – weitereBeispiele
> drop 3 [1,2,3,4,5]
[4,5]
-- Restliste ohne die ersten n Elemente
> length [1,2,3,4,5]
5
-- Länge der Liste (Anzahl Elemente)
> product [1,2,3,4,5] -- Produkt aller Listenelemente
120
> [1,2,3] ++ [4,5]
[1,2,3,4,5]
-- Konkatenation zweier Listen
> reverse [1,2,3,4,5] -- umgekehrt geordnete Liste
[5,4,3,2,1]
> even 11
False
> max 33 2
33
-- ist die gegebene Zahl gerade
-- grössere der beiden Zahlen
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
28
Überblickgewinnen
n
n
Wiefindetmanschnellöffentliche/freieBibliothekenunddie
darinangebotenenFunktionen undDatentypen?
Hoogle is your friend ...http://www.haskell.org/hoogle/
n
n
n
n
ZentralisiertesArchivmitSuchfunktion,
indemalleregistriertenAPIs
dokumentiertsind
Suchenach:
n Funktionsname,z.B.map
n Signatur,z.B.(a->b)->[a]->[b]
Eclipse-IntegrationüberEclipseFP
AuchmitEMACSintegrierbar
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
29
SyntaxFunktionsanwendung
n
InderMathematik:
f(a, b) + cd
WendedieFunktionf aufdie
Argumentea undb anund
addieredasErgebniszum
Produktvonc undd.
f isthiereinFunktionsname;a, b, c, d sindVariablennamen
n
InHaskell:
f a b + c * d
Argumentevonf folgenohne
Klammern;alleOperationen
durcheinSymbolrepräsentiert
à * fürdieMultiplikation.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
30
Funktionsanwendung- Beispiele
n
Gegenüberstellung:
Mathematik
Haskell
f(x)
f x
f(x, y)
f x y
f(g(x))
f (g x)
f(x, g(y))
f x (g y)
f(x) g(y)
f x * g y
RundeKlammern: ordnenArgument(e)
einerFunktionzu
bildenAusdrückeunddamit
eineVorrangordnungbei
Verschachtelung
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
31
Funktionen- undOperatorrangfolge
n
FunktionenhabenhöherePräzedenz alsOperatoren
f a + b
n
Esgibt9PräzedenzstufenfürOperatoren
n
n
-- bedeutet f(a) + b anstatt f(a + b)
RelativePräzedenzmathematischerOperatorenentsprechendden
mathematischenRegeln(z.B.hat* hathöherePräzedenzals+)
FunktionsanwendunghatStufe10
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
32
Skript/ProgramminGHCi laden
myFirstScript.hs
n
double x
= x + x
quadruple x = double (double x)
Reihenfolgeegal;
Definitionirgendwo,
abernichtnotwendigerweise zuvor
SkriptmitGHCi laden: > ghci myFirstScript.hs
Prelude> :l myFirstScript.hs
n
Prelude.hs undmyFirstScript.hs sinddanngeladenunddiedarin
definiertenFunktionenkönnenaufgerufenwerden.
Prelude> quadruple 10
40
Prelude> take (double 2) [1,2,3,4,5,6]
[1,2,3,4]
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
33
Skript/Programmneuladen
n
WennSkriptextern(ineinemEditor)geändertwurde,muss
esmit:reload (bzw.:r)erneutgeladenwerdenumdie
Änderungenzuaktivieren.
Prelude> :r
Ok, modules loaded: Main.
Prelude> factorial 10
3628800
Prelude> average [1,2,3,4,5]
3
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
34
HäufiggebrauchteGHCi-Kommandos
Kommando
:loadname
Kurzform
:lname
Bedeutung
ladeSkriptname
:reload
:r
aktuellesSkriptneuladen
:editname
:ename
editiereSkriptname
:edit
:info
:e
:i
editiereaktuellesSkript
InformationzuTyp/Funktion
:typeexpr
:help
:texpr
:?
zeigeTypvonexpr
zeigealleKommandos
:quit
:q
beendeghci
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
35
GHCCompiler
hello.hs
module Main where
main :: IO()
main = putStrLn "Hello, World"
Programmkompilieren:
> ghc –o hello hello.hs
> ./hello
> Hello, World
n
AnalogzuvielenanderenSprachenistdiemain Funktion(optional
imModulMain) – welchegleichzeitigeinesog.Aktion ist;dazu
spätermehr– derEinstiegspunktineinHaskell-Programm.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
36
EinrückungalsStrukturierungselement (i)
n
n
InHaskell (ähnlichwiez.B.inPython)kanndieEinrückungimQuelltext
eineRollespielen:BlöckekönnendurchEinrückunggebildetwerden,d.h.
Whitespace (LeerzeichenundTabulatoren)hateineabgrenzende
Semantik.
WennBlockbildungdurchEinrückung,dannmüssenineinerSequenzvon
Zeilen(z.B.Definitionen)alleinexaktderselbenSpaltebeginnen:
a = 10
b = 20
c = 30
a = 10
b = 20
c = 30
a = 10
b = 20
c = 30
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
xs = 10
x = 20
c = 30
28.April2017
37
EinrückungalsStrukturierungselement (ii)
n
BlockbildungdurchEinrückungvermeidetdieNotwendigkeit
spezielleSymbolezurBlockbegrenzungbenutzenzumüssen.
a = b + c
where
b = 1
c = 2
d = a * 2
implizite
Gruppierung
bedeutet
a = b + c
where
{b = 1;
c = 2}
d = a * 2
explizite
Gruppierung
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
K08
Haskell
1. GrundlegendeEigenschaften
2. GHCi undGHC
3. Typsystem
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
39
Typen(Wiederholung)
n
EinTypisteinBezeichner füreineMenge vongleichartigen
Elementenbzw.Werten(engl.values).
n
n
n
EineKlasseistz.B.eineüblicherweisenichtleereMengevonObjekten
(Instanzen)diesichderKlassezuordnenlassen.
AufeinemTypisteineMengevonOperationenundFunktionen
definiert.
InHaskell existiertz.B.derTyp
Bool
welchergenauzweiWerteenthält:
False
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
True
28.April2017
40
TypfehlerinHaskell
n
DieAnwendungeinerFunktionaufinkompatibleArgumente
isteinTypfehler (engl.typeerror).
> 1 + False
Error
1 ist eine Zahl andFalse
ein Bool; jedoch erwartet
+ zwei Zahlen.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
41
TypeninHaskell
n
WenndieAuswertungeinesAusdruckse einenWert
(Ergebnis)vomTypt liefert,danniste vomTypt
e :: t
n
JedersyntaktischkorrekteAusdruckhatinHaskell
demzufolgeeinenTyp,welchersichautomatisch zur
Compilezeit ableitenlässt.DiesenProzessnenntman
Typinferenz(engl.typeinference).
n
Haskell hateinstatischesundstrengesTypsystem
n EskönnenkeineTypfehlerzurLaufzeitauftreten
n GeringereFehleranfälligkeitundbessereLaufzeitperformance
(dakeineCheckszurLaufzeitnotwendigsind)
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
42
TypeinesAusdrucksabfragen
n
DerTypeinesAusdruckse kanninGHCi mitdemKommando
:type
(bzw.:t alsKurzform)
abgefragtwerden,ohnedasse dabeiausgewertetwird.
> :t "foo"
"foo" :: [Char]
> :t not False
not False :: Bool
> :t 3 + 2
3 + 2 :: Num a => a
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
43
AllgemeineDatentypeninHaskell
Typ
Breite/Präzision
Bool
Int
Integer
Float2
Double
fest(32,64bit)1
theoretischunbeschränkt
einfach(32bit)
doppelt(64bit)
Char
String
EinzelnesZeichen
Zeichenkette(ListevonZeichen)
Rational3
QuotientzweierInteger-Werte
Wertebereich
True,False
mindestens−229 bis 229−1
-∞ bis+∞
≈1.175×10-38 bis≈3.4×1038
≈4.9406564584124654×10−32
4 bis
≈1.7976931348623157×10308
UNICODE
Complex
1
Maschinenabhängig
2
Laut„RealWorldHaskell“Verwendungnichtempfohlen„...is much slower ...“
3
Ratio Bibliothek
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
44
Listentypen
n
EineListe isteineFolgevonWertendesselben Typs:
[False,True,False] :: [Bool]
[’a’,’b’,’c’,’d’]
n
n
:: [Char]
Generellgilt:
[t] istderTypvonListenderenElementevomTypt sind
ElementekönnenwiederumListendesselbenTypssein:
[[’a’],[’b’,’c’]] :: [[Char]]
n
TypistunabhängigvonderLängederListe
n
Spezialfall:leereListe
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
> :t []
[] :: [a]
28.April2017
45
Typeltypen
n
EinTupel isteineFolgevonElementenderenjeweiligerTyp
unterschiedlich seinkann:
(False,True)
(False,'a',True)
("foo",1,2)
('a',('b','c'))
::
::
::
::
(Bool,Bool)
(Bool,Char,Bool)
(Num t1, Num t) => ([Char],t,t1)
(Char,(Char,Char))
n
Generellgilt:
(t1,t2,…,tn) istderTypvonn-Tupeln deren
i-tes ElementvomTypti ist(1 ≤ i ≤ n)
AusdemTypkannmanalsodieLängedesTupels ableiten.
n
Spezialfall:leeresTupel
n
> :t ()
() :: ()
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
46
Funktionstypen
n
EineFunktion isteineAbbildungvonWerteneinesTypsauf
WerteeinesTyps.
not
:: Bool -> Bool
isDigit :: Char -> Bool
n
Generellgilt:
t1 ->t2 istderTypderKlassevonFunktionen,
dieWertevomTypt1 aufWertevomTypt2 abbilden.
n
:: (Int,Int) -> Int
ArgumentundErgebnistyp add
add (x,y) = x+y
sindnichtbeschränkt:
zeroToN
zeroToN n
:: Int -> [Int]
= [0..n]
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
47
Terminologie
Typsignatur
Funktionsduplizieren :: Bild -> Bild
name
duplizieren x = neben (spiegeln x) (graustufen x)
aktuellerParameter
formalerParameter
duplizieren springer
Ausdruck(Expression)
Funktionsrumpf
duplizieren :: Bild -> Bild
duplizieren x = neben (spiegeln x) (graustufen x)
Funktionsdefinition
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
48
Curryfizierte Funktionen
n
n
(i)
FunktionenmitmehrerenArgumentengibteseigentlichgarnichtin
Haskell:AlleFunktionenhabengenaueinArgument(odergarkeinesfalls
siekonstantsind).
EineFunktionmitmehrerenArgumentenlässtsichalsFunktion
darstellen,dieeinArgumenthatundeineFunktionalsErgebnisliefert.
f : (A1 ⇥ · · · ⇥ An ) ! B
f 0 : A1 ! (A2 ! (. . . (An ! B) . . . ))
add' :: Int -> Int -> Int
add' x y = x+y
add' hateineInt-ZahlalsArgument (x)undlieferteineFunktion
vomTypInt -> Int.DieseFunktionwiederumhateineIntZahl(y)alsArgumentundlieferteineInt-ZahlalsErgebnisx+y.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
49
Curryfizierte Funktionen
(ii)
add' :: Int -> Int -> Int
add :: (Int, Int) -> Int
n
n
n
add undadd' produzierendasselbeEndergebnis,jedochnimmtadd
beideArgumentezurselbenZeit(übereinTupel),währenddessenadd'
jeweilsnureinArgumentverarbeitet.
FunktionendiejeweilsnureinArgumentverarbeitenbezeichnetmanals
Currifiziert (ProzessseltenauchSchönfinkeln genannt).
HauptvorteiltheoretischerArt:formaleBeweisederKorrektheitvon
Programmenwirdvereinfacht,wennalleFunktiongleichförmigsind.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
50
Curryfizierte Funktionen
n
(iii)
Beachte:
n
AbbildungspfeilinFunktionssignaturrechtsassoziativ:
Int -> Int -> Int -> Int
Int -> (Int -> (Int -> Int))
n
Funktionsapplikationlinksassoziativ:
foo x y z
((foo x) y) z
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
51
PartielleFunktionsanwendung
n
Curryfizierung ermöglichtpartielleFunktionsanwendung:
> :t zip3 -- Funktion die Dreiertupel aus drei Listen bildet
zip3 :: [a] -> [b] -> [c] -> [(a, b, c)]
> zip3 "foo" "bar" "quux"
[('f','b','q'),('o','a','u'),('o','r','u')]
> let zip3foo = zip3 "foo"
> :type zip3foo
zip3foo :: [b] -> [c] -> [(Char, b, c)]
> zip3foo "aaa" "bbb"
[('f','a','b'),('o','a','b'),('o','a','b')]
> zip3foo [1,2,3] [True,False,True]
[('f',1,True),('o',2,False),('o',3,True)]
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
52
PolymorpheFunktionen
n
(i)
EineFunktionistpolymorph wennihrTypmindestenseine
Typvariable enthält.
length :: [a] -> Int
Für beliebige Typen a liefert length
einen Integerals Ergebnis,gegeben eine
Liste mit Elementen vom Typ a.
Beispiel:
> length [False,True] -- a = Bool
2
> length [1,2,3,4]
4
-- a = Int
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
53
BeispielepolymorpherFunktionen
n
ZahlreicheFunktionenausPrelude.hs (undanderen
Bibliotheken)sindpolymorph,z.B.:
fst
:: (a,b) -> a
head :: [a] -> a
take :: Int -> [a] -> [a]
zip
:: [a] -> [b] -> [(a,b)]
id
:: a -> a
compare :: Ord a => a -> a -> Ordering
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
54
ÜberladeneFunktionen
n
EinepolymorpheFunktionistüberladenwennihrTyp
mindestenseineTypnebenbedingung(engl.typeconstraint)
enthält.
Beispiel:
sum :: Num a => [a] -> a
FürbeliebigeTypena die
vonNum abgeleitetsind
liefertsum einErgebnis
vomTypa gegebeneine
ListevomTypa.
> sum [1,2,3]
6
-- Int
> sum [1.1,2.2,3.3]
6.6
-- Float
> sum ['a','b','c']
ERROR
-- Char
-- kein Num
Num isteineTypklasse diealsOberklassefürnumerischeDatentypenvorgesehenist.
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
55
Typklassen
n
TypklasseninHaskell sindvergleichbarmitInterfacesinJava.
Num
NumerischeTypen
Eq
TypenfürderenElementeGleichheitdefiniertist.
Ord
TypenaufderenElementeneineOrdnung
definiertist.
Beispiele:
(+)
:: Num a => a -> a -> a
(==) :: Eq a
(<)
=> a -> a -> Bool
:: Ord a => a -> a -> Bool
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
56
Namensregeln
n
Haskell unterscheidetzwischenGross- undKleinschreibung
name
naMe
Name
unterschiedlicheNamen/Bezeichner
n
TypenundKonstruktoren beginnenmiteinemGrossbuchstabe
n
Variablen undFunktionenbeginnenmiteinemKleinbuchstabe
n
n
ZusätzlichdarfauchderUnterstrich_undweitereSonderzeichenfür
Funktionenverwendetwerden:
arg_2
myFun
fun1
_myFun
NeuereVersionenunterstützenauchUNICODE-Zeichen:
пять
два
x’
умножить
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
57
Operatoren
n
n
SindauchFunktionen:
binärerOperator a b istzweistelligeFunktion
Standardmässigvorhandenebinäre/unäre Operatoren
n
n
n
(a, b)
ArithmetischeOperatoren:
+,*,^,-,div,mod,abs,negate
Vergleichsoperatoren:
beachte:nicht!= wieinC/C++/Java
>,>=,==,/=,<=,<
FürdieDefinitionneuerOperatorengeltenimPrinzipdieselben
NamensregelnwiefürFunktionen
n
n
VerwendbareZeichen:
! # $ % & * + . / < = > ? @ \ : - | ~ ^
ReservierteNamen(Bezeichner):
_ .. : :: = \ | <- -> @ ~ =>
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
58
Fixity: Assoziativität undPräzedenz
n
DieKombinationausAssoziativität undPräzedenzvonOperatoren
wirdauchalsFixity bezeichnet:
n
infixl – Infixoperator,linksassoziativ,z.B.:
a+b+c+d
n
((a+b)+c)+d
infixr – Infixoperator,rechtsassoziativ,z.B.:
(f.g.h) a
n
à
à
f (g (h a))
infix – Infixoperator,nichtassoziativ,z.B.:
a<b<c à weder(a<b)<c nocha<(b<c) gilt
n
Deklaration: infixr 5 ++ -- rechtsassoz.; Präzedenz 5
infixl 9 .
-- linksassoz.; Präzedenz 9
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
59
Fixity - Beispiele
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
60
Beispiel:Operatordefinieren
n
Operator+++und***definieren:
infixl
infixl
6 +++
7 ***
infixl
infixl
myOp.hs
7 +++
6 ***
(+++) :: Int -> Int -> Int
a +++ b = a + 2*b
(***) :: Int -> Int -> Int
a *** b = a - 4*b
n
Anwendung(GHCi):
Prelude> l: myOp.hs
Prelude> 1 +++ 2 *** 3
-19
(1 + 2*(2 – 4*3))
((1 + 2*2) – 4*3)
thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf
28.April2017
Herunterladen