www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

paco89

Gepostet:
24.02.2012 17:43

Programmierung in Haskell  
hi,

ich hab folgende aufgabe und würde gerne wissen wie man an sowas rangehen muss. also die aufgabe lautet:

a) Diese Aufgabe beschäftigt sich mit der Nahrungsaufnahme und -beschaffung von Nagetieren. Die einzige betrachtete Nagetierart ist die der Lemminge. Jeder Lemming hat einen nicht-negativen Int-Wert, der seinen Hunger symbolisiert. frisst ein lemming nahrung, so vermindert er seinen hunger. wir betrachten nur nüsse als nahrung. diese haben einen nicht-negativen int-wert, der ihren Sättigungswert symbolisiert.

Die folgenden data - deklarationen modellieren diesen sachverhalt:

data Nagetier = Lemming Int

data Nahrung = Nuss Int

gegeben sind die funktionen fressen und machWas :

machWas :: (a-> b) -> [a] ->

machWas f [x] = []
machWas f (x:xs) = (f x) :machWas f xs

fressen :: Nagetier -> Nahrung -> Nagetier
fressen (Lemming i) (Nuss n)
| n > i = Lemming 0
| otherwise = Lemming (i - n)




welchen wert liefert der folgende ausdruck zurück?

machWas (\\\\x -> fressen x (Nuss 3) ) [Lemming 5, Lemming 2, Lemming 2]




ich lerne die sprache haskell neu und würde gerne wissen, wie man solche aufgabentypen bearbeitet. daher ist mir die vorgehensweise in diesem fall viel wichtiger als die lösung.


über eine antwort würde ich mich freuen.



lg


Zum Seitenanfang    
 
paco89

Gepostet:
24.02.2012 18:02

   
also ich bin wie folgt an die aufgabe rangegangen. schließlich verstehe ich inzwischen schon ein wenig von haskellcodes. also :

ich muss einfach nur die definitionen abarbeiten. also :

1) fressen (Lemming 5) (Nuss 3) . ich hab aus der gegebenen liste in dem ausdruck das erste element lemming 5 in x eingesetzt. nun ist in diesem fall i > n also muss trifft der otherwise - fall zu . => Lemming (i-n) = Lemming (5-3) = Lemming 2

2) fressen (Lemming 2) (Nuss 3). jetzt habe ich das 2. element aus der liste genommen. ich sehe das i<n ist, also trifft der 1. fall zu und als 2. lösung kommt Lemming 0 raus.

3) in der liste befindet sich jetzt nur noch ein einziges element. die definition machWas f [x] = [] sagt uns, dass jetzt nur noch die leere Liste als lösung rauskommen kann . also ich als lösung insgesamt:

[Lemming 2, Lemming 0]




hab ich das so richtig gelöst?
Zum Seitenanfang    
 
IKT

Gepostet:
24.02.2012 18:55

   
Ja, so wie ich das sehe hast du es richtig erledigt!

Übrigens würde die Funktion machWas, wenn sie auch auf das letzte Element einer Liste die Funktion f anwendet und dies wieder in eine Liste packt, der Funktion
map :: (a -> b) -> [a] -> entsprechen -- wieso wird hier das [b] verschluckt?
(http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:map)

Dein Vorgehen ist richtig und das ist ja auch das schöne an Haskell: Man braucht nur den Definitionen folgen, kann überall im Programm einsteigen und sich jede Funktion separat angucken und sich dabei darauf verlassen, dass sich jede Funktion immer gleichverhält, egal, wann man im Programm die Funktion aufruft.
Zum Seitenanfang    
 
paco89

Gepostet:
24.02.2012 19:28

   
oh,das mit dem hab ich wohl vergessen, abzutippen. steht aber auf jdn. fall in der aufgabenstellung.
übrigens vielen dank. hat mich gefreut, endlich mal eine aufgabe richtig gelöst zu haben. diese aufgabe hatte auch noch ne andere teilaufgabe, bei der ich nicht an einer stelle bzw. an 2 stellen nicht weiß warum das so ist wie es ist. also hier ist die teilaufgabe

b)

\\\"Ein Lemming versteckt seine im Sommer gesammelte Nahrung in einem Tunnelsystem. Ein Tunnelsystem besteht aus Kammern mit Nahrung, leeren Kammern und Verzweigungen in weitere Tunnelsysteme nach links und rechts.

data Tunnelsystem = Kammer Nahrung | Leere Kammer | Verzweigung Tunnelsystem Tunnelsystem

Außerdem sei die folgende data-Deklaration Richtung vorgegeben:

data Richtung = links | rechts

Definieren sie die funktion verstecken vom Typ
Tunnelsystem -> Nahrung -> [Richtung] -> Tunnelsystem


Als Argument bekommt die funktion ein Tunnelsystem, eine Nahrung und einen Weg vom Typ [Richtung] (also eine Liste von Anweisungen, die ausdrücken, ob man einer Verzweigung in den linken oder rechten Teilbaum absteigt). Die Funktion verstecken liefert ein Tunnelsystem zurück, bei dem die Nahrung an der stelle, auf die der pfad zeigt, in eine kammer gelegt wird. gehen sie hierbei davon aus, dass der pfad in einem term LeereKammer endet und ersetzen sie diese durch eine Kammer n. An den anderen Stellen ändert sich das Tunnelsystem nicht.\\\"



also ich hab natürlich dazu ein paar skizzen gemacht, aber weil ich neu mit haskell angefangen hatte, waren meine ansätze alle falsch, als ich in die musterlösung geschaut hab. so die musterlösung habe ich zwar verstanden, aber wie ich oben schon angegeben habe, tauchten auch da ein paar fragezeichen auf. also die musterlösung lautet:


verstecken :: Tunnelsystem -> Nahrung -> [Richtung] -> Tunnelsystem

verstecken LeereKammer n [] = Kammer n
verstecken (Verzweigung l r) s (Links: pfad) = Verzweigung (verstecken l s pfad ) r
verstecken (Verzweigung l r) s (Rechts: pfad) = Verzweigung l ( verstecken r s pfad)




nun die 1. definition bezieht sich auf den satzteil .....der pfad in einem term [b]LeereKammer endet und ersetzen sie diese durch eine Kammer n[/b]. das ist klar.

nun zur 2. und dritten definition. hier verstehe ich eigtl. gar nichts. ich weiß nur , dass das die beiden definitionen sein, die angeben, wie man sich verhalten musss, wenn man vor einer verzeigung steht. aber was genau die schreibweise bedeuten soll, davon habe ich keine ahnung. was bedeutet z.b. das s ?

wäre nett, wenn mir jmd. diese 2 definitionen erklären könnte.....danke schon ma im voraus....;)



lg
Zum Seitenanfang    
 
IKT

Gepostet:
24.02.2012 20:21

   
Hast du denn in deinem anderen Thread

\"data T a = C1 | C2 a (T a)

i :: [e] -> T e
i (x:xs) = C2 x (i xs)
i [] = C1\"

verstanden? Vom Prinzip her ist es das selbe.

Zur 2. Zeile:
\"verstecken :: Tunnelsystem -> Nahrung -> [Richtung] -> Tunnelsystem \"
\"verstecken (Verzweigung l r) s (Links: pfad) = Verzweigung (verstecken l s pfad ) r\"
\"(Verzweigung l r)\" matchst du gegen das Tunnelsystem. \"(Links: pfad)\" gibt dir an, dass du nach links gehen musst, \"pfad\" ist eine eventuell leereListe mit weiteren Angaben wo man lang musst. Dort steht wie gesagt \"Links\", also gibst du ein Tunnelsystem zurück, bei dem du dem rechten Pfad (\"r\", den hast du ja weil du dagegen matchst) einfach so lässt wie er ist, damit macht man ja nix. Zu \"(verstecken l s pfad )\" auf der rechten Seite des Rückgabetyps: Du weißt, dass du irgendwo links die Nahrung verstecken möchtest, also wendest du die \"verstecken\"-Funktion jetzt auf das linke Teilsystem an, zudem übergibst du noch die restlichen Pfade (\"pfad\") und die Nahrung. Bedenke: die Funktion verstecken gibt im Endeffekt ein Tunnelsystem zurück, als passt es auch dass du sie dort anwenden darfst.
Zum Seitenanfang    
 
paco89

Gepostet:
25.02.2012 10:57

   
ah, okay. jetzt ist alles klarer geworden. ich merke, dass ich mehr haskell-codes bearbeiten muss, um ein gefühl dafür zu kriegen, wie so etwas aufgebaut ist. na ja, das wird schon. vielen dank für die hilfe;)
Zum Seitenanfang