www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Majin_Clodan

Gepostet:
08.11.2008 16:15

Bildpunkt und die Bedeutung von "elem"??  
Hi Leute!
Also ich habe ein PRoblem mit Haskell(irgendwie logischxD). Ich habe gerade mein IT-Studium angefangen und werde hierbei sofort mit Haskell konfrontiert. Hierbei bekommen wir immer jede Woche Übungsaufgaben, wie z.B. das folgende:

-- Eine Bitmap ist eine Koordinatenliste der gesetzten Bildpunkte
-- 1. Komponente in einer Koordinate ist die Spalte,
-- 2. Komponente die Zeile
type Bitmap = [(Int,Int)]
-- b=Breite, h=Höhe, s=Spalte, l=Koordinatenliste
showBMP :: Bitmap -> Int -> Int -> IO()
showBMP l b h = putStr(bmph l b (h-1) 0) where
bmph l b h s
| s == b && h == 0 = ""
| s == b = '\n':(bmph l b (h-1) 0)
| elem (s,h) l = '*':(bmph l b h (s+1))
| otherwise = ' ':(bmph l b h (s+1))


Die Aufgabe dazu war:
Die Funktion erhält die Breite b und Höhe h des Bildes in Bildpunkten sowie eine Liste l der Koordinaten im Bild, an denen ein Bildpunkt gesetzt ist (Stern). Diese Koordinatenliste repräsentiert die Bitmap, für die der Datentyp Bitmap deklariert wurde. Der Ursprung des Koordinatensystems ist der linke untere Bildpunkt mit den Koordinaten (0,0). Der Aufruf
showBMP [(0,0),(0,10),(10,10),(10,0),(5,5)] 11 11
erzeugt folgende Ausgabe:

Das entstehende Bild findet man auf dem folgenden Link auf Seite 2:
https://www-docs.tu-cottbus.de/programmiersprachen-compilerbau/public/Prog_Praktikum/prak2/Blatt2.pdf

Nun zu meinem Problem.
Ich weiß so in etwa, was das Programm macht, aber hierbei werde ich mit so viel neues konfrontiert, dass ich überfordert bin. Ich möchte zu einigen etwas sagen und würde gerne wissen, ob das richtig ist:
type Bitmap => es wurde etwas mit den Eigenschaften einer "Bitmap" definiert
putStr => eine Ausgabeart, ganz so wie "prelude", aber wo ist hierbei der Unterschied?
where => eine Art wiederholende Schleife, welche so lange die Bedingungen kontrolliert, bis es nicht mehr kontrollierbar ist(bei dem obigen Beispiel z.B.)

Das ist das, was ich bisher so ungefähr herausgefunden habe. Ich weiß jedoch nicht, was die Zeile in den Guards:
elem (s,h) l
macht. Kann mir das jemand genau erklären?? O.o Dies ist nähmlich der Knackpunkt und wenn ich das nicht verstehen, kann ich auch weiterführende aufgaben, die ich noch machen muss, nicht machen. :(


Herzlichen Dank schon einmal im vorraus! :)
MFG Majin_Clodan
Zum Seitenanfang Homepage      
 
Siracusa

Gepostet:
08.11.2008 19:04

   
Hallo!

> type Bitmap => es wurde etwas mit den Eigenschaften einer "Bitmap" definiert

type Bitmap definiert einen neuen Typ Bitmap, der gleichbedeutend ist mit [(Int,Int)]. Du kannst also statt [(Int,Int)] schreiben zu müssen jetzt einfach Bitmap schreiben.

> putStr => eine Ausgabeart, ganz so wie "prelude", aber wo ist hierbei der Unterschied?

putStr gibt einen String auf der Konsole aus, ähnlich wie write oder print in anderen Sprachen. Das Prelude allerdings ist eine Programm-Bibliothek mit Funktionen, die standardmäßig mit jedem Haskell-Programm geladen wird. Dort ist bspw. auch die Funktion putStr definiert.

> where => eine Art wiederholende Schleife, welche so lange die Bedingungen kontrolliert, bis es nicht mehr kontrollierbar ist(bei dem obigen Beispiel z.B.)

Nee. where führt lokale Definitionen ein. In deinem Beispiel wird in der Funktion showBMP die Hilfsfunktion bmph benutzt, die aber noch nicht definiert wurde. Mit dem where ergänzt man diese Definition, so daß sie nur in der Funktion showBMP sichtbar ist. Das "where" kann man lesen wie in einer mathematischen Formel das "wobei", also sozusagen Zusatzerklärungen zur Formel. Die "Schleife" entsteht durch den rekursiven Aufruf von bmph innerhalb von bmph.

> elem (s,h) l

Es wird geprüft, ob (s,h) als Element in der Liste l enthalten ist. elem funktioniert auch mit anderen Datentypen, z.B. elem 1 [1,2,3] = True oder elem 'x' "abc" = False.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
donutfan

Gepostet:
11.11.2008 21:25

   
falscher thread sry
Zum Seitenanfang