Haskell lernen und aufkommende Fragen.



  • Also mit den neuen Informationen, versuche ich mal nun folgende Funktion zu erklären:

    einfuegen :: (Name, Adresse) -> Adressbuch -> Adressbuch
    einfuegen x = fromWBuch . W.einfuegen x . toWBuch
    

    Es wird die Funktion einfuegen im Modul Woerterbuch aufgerufen.
    Diese Funktion erwartet als Eingabe folgende Typen:

    einfuegen :: (k, v) -> WBuch k  v -> WBuch k v
    einfuegen x (D l) = D (x:l)
    

    Name und Adresse sind also (a,b)
    Leider fällt es mir jetzt schon sehr schwer, den weiteren Ablauf zu erklären. In der Signatur steht,
    dass nun der Typ Adressbuch erwartet wird und dieser wird wohl mit fromWBuch übergeben.
    Aber die Funktion einfuegen im Woerterbuch benötigt doch den Typ WBuch also toWBuch.
    "W.einfuegen x . toWBuch" diese zwei Werte werden doch an die Funktion einfuegen aus dem Woerterbuch übergeben.
    Durch toWBuch wird auch der passende Typ übergeben.
    Aber wozu brauch ich denn das fromWBuch?
    Auch die Signatur aus der Funktion einfuegen im Adressbuch verstehe ich nicht so ganz.

    einfuegen :: (Name, Adresse) -> Adressbuch -> Adressbuch
    

    am Ende kommt doch der Typ WBuch raus und nicht Adressbuch...



  • Es wurde zwar schonmal gesagt, aber du verwechselst newtype mit type .

    In der Benutzung ist ein Typ mit newtype genau das gleiche wie einer mit data , stell dir also vor, anstatt newtype stünde überall data.



  • ist mir gar nicht bewusst das ich das tue.. 😞

    einfuegen :: (Name, Adresse) -> Adressbuch -> Adressbuch
    einfuegen x = fromWBuch . W.einfuegen x . toWBuch
    

    dieser Teil ist mir ja klar denke ich:

    W.einfuegen x . toWBuch
    

    da die Funktion im Wörternuch das x und halt den Typ WBuch benötigt.
    das fromWBuch steht ja VOR dem Funktionsaufruf.. durch den "." vor dem "W.einfuegen" wird dadurch der Rückgabetyp von der Funktion W.einfuegen also WBuch dann zu einem Adressbuch?



  • einfuegen :: (Name, Adresse) -> Adressbuch -> Adressbuch
    einfuegen x = fromWBuch . W.einfuegen x . toWBuch
    

    Erstmal die Signatur analysieren. Der -> Operator ist rechtsassoziativ, sie wird also als

    einfuegen :: (Name, Adresse) -> (Adressbuch -> Adressbuch)
    

    verstanden. Übersetzt: einfuegen ist eine Funktion, der man ein Paar (Name,Adresse) übergibt, und die eine Funktion, die ein Adressbuch auf ein Adressbuch abbildet, zurückgibt.

    In der Definition sieht man nun den .-Operator für die Komposition von Funktionen. Komposition ist die Hintereinanderausführung von Funktionen, (f . g) x bedeutet f (g x). einfuegen x ergibt also eine Funktion, die auf ihr Argument, ein Adressbuch, zuerst toWBuch anwendet (es kommt ein WBuch heraus), dann auf das Ergebnis die einfuegen-Funktion aus dem Woerterbuch-Modul anwendet (es kommt ein WBuch mit eingefügtem x heraus), auf das Ergebnis dann fromWBuch anwendet (es kommt ein Adressbuch heraus).

    Man kann die Signatur von einfuegen auch so verstehen, dass dort zwei Parameter, ein Paar (Name,Adresse) und ein Adressbuch, übergeben werden und ein Adressbuch herauskommt. Das Prinzip des Curryings besagt, dass man Funktionen mit mehreren Argumenten als Funktionen mit einem Argument, die eine weitere Funktion zurückgeben, auffassen kann. Das wäre dann die obige Interpretation. Man hätte einfuegen aber auch in der nicht gecurryten Form schreiben können:

    einfuegen :: (Name, Adresse) -> Adressbuch -> Adressbuch
    einfuegen x a = fromWBuch (W.einfuegen x (toWBuch a))
    


  • Bashar schrieb:

    Th69 schrieb:

    da hast du dir aber etwas vorgenommen, Haskell als erste Programmiersprache zu erlernen: m.E. ist es nicht so einfach gleich funktional und rekursiv zu denken (da einem sequentielle Abläufe ersteinmal einfacher erscheinen).

    Es gibt da ja auch die Meinung, dass man funktionale Programmierung viel einfacher verstehen würde, wenn man vorher nicht imperativ "verseucht" ist.

    Gibts diese Meinung auch außerhalb dieses Forums? Oder ist diese Meinung einfach nur eine Ausrede?



  • Da der Großteil der (programmierenden) Weltbevölkerung nicht in diesem Forum ist, gehe ich davon aus, dass es auch da Menschen gibt, die diese Meinung haben.
    Man könnte ja mal eine richtige Studie mit zufallseingeteilten Gruppen usw. machen. 😉
    Aber wofür sollte es eine Ausrede sein?

    Ich fand's auch interessant, dass Schmidto sich Haskell als erste Sprache ausgesucht hat, aber warum auch nicht? 🙂
    Gerade bei Mathematikern könnte ich mir vorstellen, dass es einige von ihnen intuitiv schneller funktional als imperativ Programmieren können.



  • Dobi schrieb:

    Aber wofür sollte es eine Ausrede sein?

    Dafür, dass Haskell einfach nicht intuitiv zu erlernen ist. Jetzt versuchen die Haskell Fans sich halt darauf raus zu reden, dass man vorher zuviel imperativ programmiert hat.



  • Dieser Thread wurde von Moderator/in Marc++us aus dem Forum Rund um die Programmierung in das Forum Funktionale Programmiersprachen verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Da mag wohl jemand functional nicht, wie? 😉
    Genau wie für verschiedene Aufgaben verschiedene Programmiersprachen besser oder schlechter geeignet sind, so sind sie es auch für verschiedene Menschen.



  • Mal zur Klarstellung: Ich hab von funktionaler Programmierung gesprochen, nicht von Haskell, und von intuitiv war auch nicht die Rede. Wenn du das Thema vertiefen willst, schlage ich vor, du machst einen neuen Thread auf.


Anmelden zum Antworten