www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Nimbul

Gepostet:
13.04.2012 16:39

Frage zu: Berechnung von Zahlen inkl. IO Action  
Hallo,

hab folgenden Code:


kp p1 p2 v1 v2 =
if (v1 && v2 == True) then
(
((min p1 480) / 41.7391304347826)+
((min p2 375) / 44.1176470588235)
)
else
0


Das ist eine Aufgabe aus der Uni, mit der Übungspunkte berechnet werden, die, wenn man vorgerechnet hat, auf die Klausur angerechnet werden.

Die Aufgabe ist eigentlich schon gelöst, ich würde die aber gerne benutzerfreundlicher machen.
Also mit einem putStrLn Befehl, der nach p1 fragt, dann nach p2, usw. und trotzdem die angegebene Rechnung macht. Am Ende soll dann ein Satz stehen. Z.B. \"Sie haben ++ X ++ Klausurpunkte erhalten\"

Im Netz gibts haufenweise Tipps, vor allem mit readLn. Leider gibt es kein Beispiel, das sich mit IO Actions und Zahlen/ Rechnungen auseinandersetzt. Vielleicht habt ihr ja Tipps.
Vor allem gehts mir eigentlich um die Frage, ob und wie ich IO Actions und einfache Rechnungen in einen Code schreibe.

Wie gesagt, die Aufgabe ist so schon fertig, geht nur noch um meinen Wissensdurst Smilie

LG
Zum Seitenanfang    
 
IKT

Gepostet:
13.04.2012 20:52

   
Schön dass du dich näher für Haskell interessierst, wenn du Lust und Zeit hast lohnt es sich aufjedenfal http://learnyouahaskell.com/ durchzuarbeiten. Es ist in einem sehr angenehmen Stil geschrieben und kostenlos online lesbar.

Hier ist Kode der dein Anliegen löst: http://hpaste.org/66922

Ich habe deine kp-Funktion etwas \\\'funktionaler\\\' geschrieben, das mit den vielen Klammern und if\\\'s ist doch nicht wirklich schön. :)
In der main-Funktion ist der Grundablaufplan zu sehen: Der User wird aufgefordert eine Eingabe zu machen (putStrLn \\\"Geben Sie p1 ein\\\"), dann wird eine Funktion aufgerufen (askUser ...) die eine (korrekte) Eingabe liefert und so weiter und so fort bis am Ende alles in die kp-Funktion eingespeist und das Ergebnis ausgegeben wird. So läuft es im Prinzip ab und man kann es eigentlich recht intuitiv ergänzen.

Wenn du Funktionen welche sich in Haskell-Bibliotheken befinden nicht kennst und nachschlagen möchtest kannst es z.B. unter folgendem Link tun http://www.haskell.org/hoogle/?hoogle=putStrLn : putStrLn ist vom Typ String -> IO (). Das bedeutet, putStrLn nimmt einen String und interagiert irgendwie mit der Außenwelt, in diesem Fall gibt es den Text auf der Konsole aus.
askUser ist vom Typ (String -> Maybe a) -> IO a. Das heißt, es nimmt eine Funktion vom Typ (String -> Maybe a), interagiert irgendwie mit Außenwelt und hält etwas vom Typ a, \\\'eingeschlossen in IO\\\' bereit. Dieses etwas extrahieren wir aus IO in der Main-Funktion mit dem <- und benutzen es später weiter. In (String -> Maybe a) ist das selbe a auch zusehen, da askUser je nach Fall entweder etwas vom Typ Float (p1,p2) oder vom Typ Bool (v1,v2) abfragen soll. So wird wie in der main-Funktion zu sehen ist askUser 2x die Funktion maybeReadFloat vom Typ String -> Maybe Float und 2x die Funktion maybeReadBool vom Typ String -> Maybe Bool übergeben. Beide Funktionen benutzen die Funktion maybeRead :: Read a => String -> Maybe a und werden eingesetzt, damit die Funktion reads innerhalb von maybeRead weiß, von welchem Typ das x sein soll (Bool oder Float) und in case...of richtig gematchen werden kann.

Das war jetzt alles ein bisschen viel auf einmal, ich hoffe ich habe nichts falsch erklärt.
Zum Seitenanfang    
 
Landei

Gepostet:
17.04.2012 08:31

   
Der Code sieht gut aus, es wäre aber anzumerken, dass man maybeReadBool und maybeReadFloat eigentlich nicht braucht, sondern maybeRead ausreicht. Der richtige Typ für die Aufrufe kann anhand der Signatur von kp inferiert werden.
Zum Seitenanfang    
 
IKT

Gepostet:
17.04.2012 17:08

   
Danke für den Hinweis. Es ist interessant zu sehen wie diese Informationen von \"(kp p1 p2 v1 v2)\" über die Aufrufe von askUser hoch zu maybeRead \"weitergereicht\" werden ...
Zum Seitenanfang    
 
Landei

Gepostet:
27.04.2012 21:38

   
Die Ausgangsfunktion kann auch so geschrieben werden:

kp p1 p2 v1 v2
| v1 && v2 = ((min p1 480) / 41.7391304347826) + ((min p2 375) / 44.1176470588235)
| otherwise = 0
Zum Seitenanfang