• Haskell - Ein Einstieg
  • anonym
  • 30.06.2020
  • Informatik
  • 13
Um die Lizenzinformationen zu sehen, klicken Sie bitte den gewünschten Inhalt an.

Has­kell - Ein Ein­stieg

Wir haben uns be­reits etwas mit Has­kell aus­ein­an­der­ge­setzt. Jetzt sollst du selbst mit Has­kell pro­gram­mie­ren. Rufe dazu die Seite https://repl.it auf (oder nutze den QR-​Code rechts).

Öffne eine Haskell-​Umgebung. Rechts fin­dest du die Kon­so­le, in der Mitte kannst du Skript­files er­stel­len.

1
Nutze zu­erst die Kon­so­le um ein­fa­che Re­chen­auf­ga­ben aus­zu­pro­bie­ren.
  • Bei­spiel:
    3 + 4
    3.0 + 4
2
Nun ist das Standard-​Anfangsprogramm an der Reihe. Er­stel­le ein Pro­gramm­file, das die Aus­ga­be Hallo Welt. er­zeugt.
  • Nutze dazu die Funk­ti­on put­StrLn().
3
Aus der letz­ten Woche kennst du die Funk­ti­on dou­ble­Me, die einen Wert als Ein­ga­be nimmt und das Dop­pel­te aus­gibt.
Um Feh­ler vor­zu­beu­gen, füge eine Main­rou­ti­ne hinzu, wie rechts ab­ge­bil­det.
  • Schrei­be die Funk­ti­on dou­ble­Me in einen File.
  • Er­wei­te­re dei­nen File um eine Funk­ti­on dou­bleUs, die zwei Ein­ga­ben be­kommt und das Dop­pel­te der Ein­ga­be­wer­te sum­miert und das Er­geb­nis aus­gibt. Nutze hier­für dou­ble­Me.
  • Teste beide Funk­ti­o­nen.

main = do

put­StrLn(run­ning)

if-​Abfrage:

if Be­din­gung

then Ak­ti­on 1

else Ak­ti­on 2

4
Auch die Funk­ti­on dou­bleS­mall­N­um­ber, die eine Zahl unter 100 ver­dop­pelt, Zah­len über 100 und die 100 selbst aber un­ver­än­dert aus­gibt, ist be­reits be­kannt.
  • Schrei­be die Funk­ti­on dou­bleS­mall­N­um­ber.
    Ver­wen­de hier­für die if-​Struktur.

num­bers = [1,2,3,4]

5
De­fi­nie­re die Liste num­bers vor der Main-​Routine des Pro­gramms.
Teste an­schlie­ßend die dir be­reits be­kann­ten Funk­ti­o­nen tail, init, head und last.
6
De­fi­nie­re wei­te­re Lis­ten list1 bis list3 wie rechts an­ge­ge­ben ober­halb der Main-​Routine.
  • Teste die Funk­ti­on length, indem du sie auf alle Lis­ten an­wen­dest.
  • Teste nun die Funk­ti­on null.
  • Teste die Funk­ti­on re­ver­se.
  • Teste die Funk­ti­o­nen take und drop, indem du die Ein­ga­ben
    take 3 list1 und drop 3 list1 in der Kon­so­le aus­führst.
  • Teste die Funk­ti­o­nen mi­ni­mum, ma­xi­mum, sum und pro­duct.

list1 = [1..10]

list2 = []

list3 = [6,8,9,10,3]

Lis­ten und Be­din­gun­gen

Um Lis­ten er­zeu­gen zu las­sen, hel­fen Be­din­gun­gen.

Die Syn­tax ist [Re­chen­an­wei­sung | Be­din­gun­gen für die Va­ri­a­blen].

Zum Bei­spiel er­zeugt [x^2|x <- [1..10], mod x 2 ==0] eine Liste, in der die Qua­dra­te der ge­ra­den Zah­len zwi­schen 1 und 10 ent­hal­ten sind.

7
Er­zeu­ge Lis­ten, die die fol­gen­den Be­din­gun­gen er­fül­len:
  • es sind nur ge­ra­de Zah­len ent­hal­ten, die klei­ner sind als 10
  • es sind nur un­ge­ra­de Zah­len ent­hal­ten, die zwi­schen 10 und 20 lie­gen
  • es sind alle Zah­len ent­hal­ten, die zum Ein­mal­eins der 3 ge­hö­ren (also bis 30).
  • es sind alle Zah­len zwi­schen 0 und 100 ent­hal­ten, die so­wohl durch 7 als auch durch 5 teil­bar sind.
8
Die Ver­flix­te 7 ist ein Spiel für die Grund­schu­le, bei dem die Kin­der das Ein­mal­eins der 7 üben, indem sie beim Zäh­len alle Zah­len durch Piep er­set­zen, die durch 7 ge­teilt wer­den kön­nen.
Er­zeu­ge eine Liste der Zah­len von 1 bis 70, wie sie im Spiel Ver­flix­te 7 ent­steht, wobei der Ein­fach­heit hal­ber die durch 7 teil­ba­ren Zah­len durch 0 er­setzt wer­den sol­len.
9
Er­zeu­ge eine Liste, die alle Prim­zah­len ent­hält, die klei­ner als 50 sind.
  • Be­gin­ne mit einer Liste der Zah­len bis 50.
  • Fil­te­re alle Zah­len aus, die keine Prim­zah­len sind, weil sie durch eine Prim­zahl ge­teilt wer­den kön­nen.
  • Füge bei der Fil­te­rung Aus­nah­men hinzu, so dass die Prim­zah­len selbst nicht aus­ge­fil­tert wer­den.
    Ver­wen­de dafür die lo­gi­schen Ope­ra­to­ren
    und && und oder ||.
  • Es ge­nügt die Prim­zah­len bis 11 in der Fil­te­rung zu ver­wen­den.

Prim­zah­len:



2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47

Tupel

Aus der Ma­the­ma­tik kennst du be­reits Tupel. Dir sind Paare und Tri­pel be­kannt, zum Bei­spiel als Ko­or­di­na­ten von Punk­ten in der Ebene oder im Raum. Has­kell kann eben­falls Tupel bil­den. Die An­zahl der Ele­men­te ist dabei nicht ein­ge­schränkt und es kön­nen auch un­ter­schied­li­che Typen ver­wen­det wer­den, zum Bei­spiel (1, Amsel).

Die Schreib­wei­se un­ter­schei­det sich nicht von der Ma­the­ma­tik. Tupel wer­den durch runde Klam­mern um­schlos­sen, die Rei­hen­fol­ge der Ele­men­te kann nicht be­lie­big ver­tauscht wer­den. Die ein­zel­nen Ele­men­te wer­den durch Kom­ma­ta ge­trennt.

10
De­fi­nie­re die Tupel p1 (1, 2, 3) und p2 (2, 4, 6) ober­halb der Main-​Routine.
  • Schrei­be die Funk­ti­on add (x1, y1, z1) (x2,y2,z3), die die Ele­men­te der bei­den Tupel ad­diert.
  • Schrei­be wei­te­re Funk­ti­o­nen sub und mult, die die Ele­men­te sub­tra­hiert bzw. mul­ti­pli­ziert.
  • Wes­halb ist eine sol­che Funk­ti­on für die Di­vi­si­on nicht ohne wei­te­res mög­lich?
11
Nutze Has­kell um fol­gen­de Auf­ga­be zu lösen:
Er­stel­le eine Liste von Drei­ecken, deren Sei­ten­län­gen zwi­schen 1 cm und 10 lie­gen.
  • Ver­wen­de ein Tupel (a,b,c), das als Drei­eck mit den Sei­ten­län­gen a, b und c ver­stan­den wird.
  • Weise jeder Va­ri­a­blen in der Be­din­gung der Liste ihre mög­li­chen Werte zu.
12
Die Auf­ga­be 11 ent­hält einen Lo­gik­feh­ler. Worin be­steht er?
13
Nutze Has­kell um fol­gen­de Auf­ga­be zu lösen:
Er­stel­le eine Liste von recht­wink­li­gen Drei­ecken, deren Sei­ten­län­ge zwi­schen 1 cm und 10 cm lie­gen.
  • Drei­ecke sind recht­wink­lig, wenn in ihnen die Sei­ten­be­zie­hung a2 + b2= c2 gilt.
14
Nutze Has­kell um fol­gen­de Auf­ga­be zu lösen:
Ein recht­wink­li­ges Drei­eck hat einen Um­fang von 24 cm. Die Sei­ten­län­gen sind ganz­zah­lig und be­we­gen sich zwi­schen 1 cm und 10 cm.
Wel­che Sei­ten­län­gen sind mög­lich?
  • Den Um­fang eines Drei­ecks be­rech­net man mit U = a+b+c.
  • Als zu­sätz­li­che Schwie­rig­keit sorge dafür, dass spie­gel­bild­li­che Drei­ecke nur ein­mal aus­ge­ge­ben wer­den.
15
Schrei­be eine Funk­ti­on dist, die als Ein­ga­be zwei Punk­te be­kommt und den Ab­stand die­ser bei­den Punk­te zu­ein­an­der be­stimmt.
  • Be­schrän­ke dich auf die Ebene, Punk­te haben also eine x- und eine y-​Koordinate.
  • Den Ab­stand eines Punk­tes P1 von einem Punkt P2 be­rech­net man mit der fol­gen­den For­mel:
    d2= (x1-x2)2 + (y1-y2)2, wobei d der Ab­stand ist.
    Es han­delt sich hier­bei um eine An­wen­dung des Sat­zes des Py­tha­go­ras.
  • Die Wur­zel be­rech­net man in Has­kell mit der Funk­ti­on sqrt.
  • Da die Wur­zel eine Kom­ma­zahl aus­gibt, möch­te sie einen ent­spre­chen­den Da­ten­typ als Ein­ga­be be­kom­men. Nutze dafür die Funk­ti­on from­In­te­gal.
  • An­ders als wir es ge­wohnt sind, schach­telt Has­kell Funk­ti­o­nen, indem Klam­mern ge­setzt wer­den, die vor dem Funk­ti­ons­na­men be­gin­nen und nach dem Ar­gu­ment enden.
    Zum Bei­spiel: sqrt (from­In­te­gral (x+y))
x