www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Neptun

Gepostet:
06.06.2010 00:17

Data Definition  
Hallo es gibt ja dieses Data keyword um Typen zu definieren.
Bin auf eine im Internet gestoßen welche so aussieht:

data Maybe a = Just a | Nothing

dazu hätte ich ein paar Fragen:

--> ich weiß nicht was das kleine 'a' hier in der definition zu bedeuten hat... gehe ich richtig der Annahme das dieses a für jeden belieben Typ steht? und muss ich das a immer links vom = auch schreiben wenn ich es rechts in den konstruktoren verwende?
--> müssen Just und Nothing nicht auch schon eigene Typen sein die irgendwo definiert sind?

lg
Zum Seitenanfang    
 
Siracusa

Gepostet:
06.06.2010 03:06

   
Hallo,

das kleine a ist eine Typvariable die für einen beliebigen Typ steht, ähnlich wie eine Typvariable in der Signatur einer Funktion. Im Normalfall müssen alle Typvariablen die du rechts verwendest auch auf der linken Seite einmal auftauchen, es gibt aber Ausnahmen, die die Sache allerdings etwas komplizierter machen.

Just und Nothing sind hier keine Typen (der Typname steht links), sondern Datenkonstruktoren, die die Werte des zu definierenden Typs darstellen. Diese können parameterlos sein, wie Nothing, oder Parameter haben, wie Just. Dabei können die Parameter feste Typen oder Typvariablen sein. Alle Datenkonstruktoren kann man als ganz normale Funktionen auffassen, die einen Wert vom Typ der links steht erzeugen. Nothing und Just könnte man also als Funktionen mit den Signaturen Nothing :: Maybe a und Just :: a -> Maybe a auffassen.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Neptun

Gepostet:
06.06.2010 14:14

   
Dankeschön für die Antwort.

Ich verstehe aber nicht wofür man die Typvariable auf der linken Seite braucht?
z.b. bei dieser Tree definition:

data Tree a = Node Integer a (Tree a) (Tree a) | Leaf Integer a

sagt dass ein Knoten aus einem Integer, irgendeinen beliebieges element und wieder einem Tree besteht.

Ist es nur syntaktisch so dass ich das "a" auch links schreiben muss oder hat das einen Nutzen oder Grund?

Und wieso muss ich wenn ich den Datentyp in einer Fkt verwende dieses a auch mitschreiben?

test :: Tree a -> Int
Zum Seitenanfang    
 
Siracusa

Gepostet:
06.06.2010 17:39

   
Nehmen wir mal den folgenden Datentyp für eine Liste:

data Liste1 a = Leer | Elem a (Liste1 a)

Die Liste ist parametrisiert über a und kann entweder leer sein oder ein Element, das vom Typ a ist, und eine Restliste haben. Diese Restliste ist wieder eine Liste die auch über a parametrisiert ist, d.h. die Restliste muss als Elemente wiederum Werte vom selben Typ a haben wie das Element in der Liste. Damit wird also sichergestellt, dass in der gesamten Liste nur Werte vom selben Typ gespeichert sind.

Jetzt mal angenommen der Typ sähe so aus:

data Liste2 = Leer | Elem a Liste2

Damit wäre a ungebunden und könnte in jedem Element theoretisch einen anderen Typ annehmen. Du könntest somit nicht mehr sicherstellen, dass die gesamte Liste nur Werte gleichen Typs hat.

Aus dem gleichen Grund muss der Parameter auch bei Funktionssignaturen mit angegeben werden. Angenommen du willst eine Funktion schreiben, die eine Liste mit Ints summiert:

summe1 :: Liste1 Int -> Int

Hier ist a auf den Typ Int spezialisiert und du hast sichergestellt, dass die gesammte Liste nur Ints enthält, die Elemente also auch addierbar sind. Mit dem zweiten Listentyp ginge eine solche Funktion nicht:

summe2 :: Liste2 -> Int

was heißen würde, du müsstest potentiell beliebige Typen miteinander addieren können, was nicht möglich ist.

Denkbar wäre in beiden Fällen aber eine Funktion länge, die die Anzahl der Elemente in der Liste angibt. Mit dem ersten Listentyp würde die Signatur dann so aussehen:

länge :: Liste1 a -> Int


Viele Grüße,

Siracusa
Zum Seitenanfang