Haskell lernen und aufkommende Fragen.
-
Bashar schrieb:
Für diese Funktion wird das eigentlich nicht benötigt. Aber wenn du es weglässt, kann man damit WBuch-Werte mit nicht vergleichbaren Schlüsseln erzeugen, bei denen dann kein lookup möglich ist.
Wie kann ich denn mit der Funktion nicht vergleichbare Schlüssel erzeugen, wenn ich am Ende doch nur eine leere Liste D [] bekomme?
Und 'newtype' legt einen neuen Datentyp an, wobei im Beispiel 'D' einfach nur ein selbstgewählter Bezeichner steht (D steht wohl für Dictionary). Sicherlich hätte man auch überall im weiteren Code einfach nur [(k,v)] schreiben können (aber dann hätte man die gleichen Lese-Probleme wie ohne die Verwendung von Aliasnamen).
das hatte ich so verstanden, dass ich einfach das "D" überall mit [(k,v)] ersetzen könnte
-
Aber nicht für das 'D' alleine, sondern für den gesamten Datentyp (D l).
-
ok verstanden
4. Maybe v kannst du dir wie einen Typen vorstellen, der entweder v oder aber ein "Nothing" bzw. "NIL" (not in list
zurückgibt - in anderen Sprachen benutzt man z.B. "optional" oder "nullable" o.ä. dafür).
Also wnen Maybe ein Typ ist aber v den selben Typen hat wie k.. dann ergibt das maybe doch gar keinen Unterschied
finde :: Eq k => k -> WBuch k v -> k
wäre dann doch das gleiche.
-
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
mittype
.In der Benutzung ist ein Typ mit
newtype
genau das gleiche wie einer mitdata
, 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.