www.matheraum.de
Das Matheforum.
Das Matheforum des MatheRaum.

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenHaskellVariable Daten- und Fkts-namen
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Informatik • Physik • Technik • Biologie • Chemie
Forum "Haskell" - Variable Daten- und Fkts-namen
Variable Daten- und Fkts-namen < Haskell < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Haskell"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Variable Daten- und Fkts-namen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 19:05 Fr 12.01.2007
Autor: no_max

Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
(<-- soll man ja reinschreiben)

ich habe folgenden (funktionierenden) Code (habe ihn mal reduziert - tatsächlich gibt es noch mehr Funktionen und Datentypen, aber ein Beispiel sollte hier reichen):
data BinTree1 = Leaf1 Float | Node1 BinTree1 BinTree1 deriving Show
data BinTree2 = Leaf2     | Node2 BinTree2 BinTree2 Float deriving Show

preOrder1 :: BinTree1 -> [Float]
preOrder1 (Leaf1 n) = [n]
preOrder1 (Node1 left right) = preOrder1 left ++ preOrder1 right

preOrder2 :: BinTree2 -> [Float]
preOrder2 (Leaf2) = []
preOrder2 (Node2 left right value) = [value] ++ preOrder2 left ++ preOrder2 right

Meine Idee: Kann man diese Funktionen und/oder Datentypen nicht irgendwie zusammenfasssen, d.h. schon in der Funktionsbenennung irgendwie das PatternMatching von Haskell (bzgl. 1 oder 2) nutzen und dann entsprechend BinTree, Node und Leaf mit dem entsprechenden Suffix zu versehen? Dass ich hier noch auf andere Probleme stoßen werde, weil z.B. der Konstruktor Node2 noch einen Float kriegt im Gegensatz zu Node1, ist mir klar (aber hier erstmal nicht die Frage).
(Oder vielleicht ist letzteres auch schon die Begründung dafür, warum soetwas wie das, was mir als Idee vorschwebt gar nicht vonnöten ist, weil halt sowieso Funktionen mit gleichen Parametern auch gleich heißen können und unterschiedlich benannte Funktionen andererseits halt sowieso unterschiedliche Parameter kriegen...?!)

        
Bezug
Variable Daten- und Fkts-namen: Antwort
Status: (Antwort) fertig Status 
Datum: 08:41 Mo 22.01.2007
Autor: kretschmer

Hallo,

die Antwort warum das nicht geht ist ganz einfach: Überlege Dir doch den Typen der resultierenden Funktion?  Ist der nun BinTree1 -> [Float] oder BinTree2 -> [Float]?  Beides wird Haskell nicht zulassen, da es ein strenges Typsystem besitzt.

Zwei Möglichkeiten bietet Haskell aber dennoch:

1) Du nimmst Either BinTree1 BinTree2 -> [Float]; dann musst Du aber jedes mal auf die Unterklasse prüfen.  (Zur Erinnerung: data Either a b = Left a | Right b).  Dies hätte allerdings den Vorteil, dass man eine Liste von Bäumen anlegen kann in der Form [Either BinTree1 BinTree2] und dann diese mit solchen Funktionen direkt bearbeiten könnte.

2) Du machst eine Klasse.  Kurz gesagt erlauben Klassen in Haskell das überladen von Operatoren/Funktionen.  So kannst Du zum Beispiel eine Klasse wie folgt für dein Problem definieren:

class BinTree a where
  preOrder :: a -> [Float]

instance BinTree BinTree1 where
  preOrder = preOrder1

instance BinTree BinTree2 where
  preOrder = preOrder2

Der Unterschied zur Lösung 1 ist der, dass man seine Bäume nicht extra in einen Either-Typen packen muss.  Diese Technik erlaubt natürlich auch nicht die Bäume zu mischen.  Es erlaubt einem nur mittels preOrder einemal preOrder1 und ein anderes mal preOrder2 zu identifizieren.  Man erstellt noch immer explizit einen Baum von einem bestimmten Typen und benutzt darauf preOrder.  Das Haskell-Klassen-System erlaubt es allerdings allgemein Funktionen zu generieren, die einen Typen einer bestimmten Klasse verwenden.  So kannst Du zum Beispiel eine Funktion sumTree wie folgt machen:

sumTree :: (BinTree a) => a -> Float
sumTree tree = foldl (+) 0 (preOrder a)


Mit freundlichen Grüßen
Matthias Kretschmer

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Haskell"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.matheforum.net
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]