www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

hccross

Gepostet:
25.03.2008 21:19

Verständnisproblem bei Listen o.ä  
Hallo Leute,

bin zur Zeit am Haskell lernen, und mir gefällts eigentlich ganz gut, aber ich hab grad ein schweres Verständnisproblem und evtl könnt ihr mir ja helfen.


module SingleQueue (QUEUE, emptyQueue, enqueue, next, dequeue, isempty) where

data QUEUE a = Queue [a]

emptyQueue :: QUEUE a
emptyQueue = Queue []

enqueue :: a -> QUEUE a -> QUEUE a
enqueue x (Queue q1) = Queue (x:q1)
...





Z.B. bei diesem Code.

data QUEUE a = Queue [a] deklariert hier ein Queue. Das versteh ich ja noch.
Aber das a darin verwirrt mich.
bedeutet das a links vom '=' das gleiche wie rechts davon?
ist das evtl rekursiv?

das irritiert mich sehr, kann mir wer von euch das erklären?

Schon mal vielen Dank.

mfg
hccross
Zum Seitenanfang    
 
Siracusa

Gepostet:
26.03.2008 21:53

   
Hallo hccross,

das a nennt man einen Typparameter. Wenn du in einer Typdeklaration auf der rechten Seite einen variablen Typ verwendest, dann muß dieser gebunden sein. Das erreicht man, indem man die entsprechende Typvariable auf der linken Seite sozusagen "deklariert". Durch dieses Hinzufügen eines Typparameters wird aus dem Typ QUEUE ein Typ höherer Ordnung, was z.B. bei der Verwendung von Haskells Typklassensystem sehr hilfreich sein kann.

Stell dir mal folgende Deklaration deiner Queue vor:
data Queue a = Empty | Element a (Queue a)

Diese Queue ist entweder leer, oder ein Element vom Typ a wird an eine Queue angehängt, die auch nur Elemente vom Typ a hat. Nun ist es wichtig, das der Typ Queue einen Typparameter hat, denn andernfalls könnten innerhalb einer Queue Elemente mit verschiedenen Datentypen enthalten sein, d.h. das a könnte in jedem Element einen anderen Typ annehmen. Durch den Typparameter wird der Typ des Elementes und der Restqueue aber auf den gleichen Typ festgesetzt.

Hoffe, ich hab dich jetzt nicht noch zusätzlich verwirrt. ;-)


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
hccross

Gepostet:
03.04.2008 13:39

   
Vielen Dank für die Antwort.

Aber so ganz versteh ichs immer noch nicht.
ich deklariere also die Elemente von QUEUE als Typ a. Dadurch kann a mehrere verschiedene Datentypen sein?
verschiedene DT in einer Queue, oder innerhalb einer Queue der gleiche DT, aber es gibt verschiedene Queues mit mehr Typen?

Welches von den beiden ist richtig?


mfg
hccross
Zum Seitenanfang    
 
hccross

Gepostet:
03.04.2008 13:45

   
jetzt hats Klick gemacht.

Das a ist also eine Vorlage für die Funktion, und später wenn ich die Funktion benutze kann ich angeben obs Int, Float oso ist.
Damit kann ich also eine Funktion erstellen, ohne einen speziellen Typ angeben zu müssen.
Zum Seitenanfang    
 
Siracusa

Gepostet:
03.04.2008 16:36

   
Hallo,

ja, wenn du so willst, sind Typparameter Vorlagen. Das ist ein großer Vorteil von Haskell, da es dir erlaubt, häufig sehr allgemeine Funktionen zu schreiben. Ein Beispiel ist die map-Funktion:
    map :: (t1 -> t2) -> [t1] -> [t2].
Sie bekommt eine Funktion übergeben, die einen bestimmten Datentyp in einen anderen Datentypen umwandelt und wendet diese Funktion auf jedes Element in der Liste an. Dabei ist für die Implementierung der map-Funktion völlig uninteressant, zwischen welchen Typen die übergebene Funktion später mal konvertiert.

map (succ :: Int -> Int) [1,2,3] = [2,3,4]
map (odd :: Int -> Bool) [1,2,3] = [True, False, True]
map (toUpper :: Char -> Char) "Hallo!" = "HALLO!"


Viele Grüße,

Siracusa
Zum Seitenanfang