Funktionale Programmierung mit Haskell



  • u_ser-l schrieb:

    Kein Wunder. Es ist das schlagende Argument dafür, warum sequentielle Notationen natürlicher sind als funktionale oder deklarative.

    Nein. Es ist kein Argument, sondern eine Behauptung. Den Beweis, dass da zwischen ein Zusammenhang besteht bist du uns noch schuldig geblieben. Ich habe allerdings schon genügend Gegenbeispiele geliefert.

    knivil schrieb:

    Guck dir lieber an, was sie im Bereich Haskell machen.

    Muss ich mal schauen, ich selbst beschaeftige mich schon eine Weile sehr intensiv mit FP, aber man kann nicht alles auf einmal lesen, verstehen und ausprobieren. Leider bin ich eher Anti-Microsoft, was meine Leseprioritaeten durchaus beeinflusst.

    Sie bezog sich in diesem Fall wohl nicht auf Microsoft, sondern auf die Leute, die mit Haskell im Moment arbeiten. Microsoft hat mit Haskell nichts am Hut. Die haben ja F#. Unter anderem deshalb, weil .NET zu unflexibel ist, um einen vernünftigen Haskell-Compiler darauf aufzusetzen.

    u_ser-l schrieb:

    Genau. Klassisches Top-Down/Bottom-Up Design, wie man es seit Jahrzehnten beim Softwaredesign für prozedurale Sprachen anwendet. Nichts Funktionales erkennbar. 👍

    Du hast nichts verstanden. Die Denkweise ist in dem Fall Top-Down. Das Ergebnis ist eine Bauanleitung für einen Motor Bottom-Up. Wenn du jetzt immer noch nicht verstehst, dass es einen Unterschied zwischen dem Denken und dem Resultat gibt, dann ist dir wohl nicht mehr zu helfen.

    u_ser-l schrieb:

    So ein Käse. [...] In 4D kannst Du das nicht. Du weißt nicht einmal, wie ein 4-dimensionaler Ball aussieht.

    Du kannst Dir eine Folge von Einzelbildern in 3D vorstellen. Das ist etwas völlig Anderes, das kann man aber nur wissen, wenn man ein wenig Ahnung von Geometrie hat.

    Du hast rein gar nichts verstanden von dem was ich geschrieben habe. Darum hast du ja auch wohl das meiste davon ignoriert.

    Nochmal: Nur weil ich mir "bildlich" kein 4D-Gebilde vorstellen kann, so heißt das nicht, dass ich mir nichts 4-dimensionales vorstellen kann. Zum Beispiel kann ich mir einen 4-dimensionalen Vorgang durch etwas 3-dimensionales vorstellen, das eine zeitliche Komponente besitzt. Und ich kann mir Zeit schon als etwas kontinuierliches Vorstellen.



  • Genau. Klassisches Top-Down/Bottom-Up Design, wie man es seit Jahrzehnten beim Softwaredesign für prozedurale Sprachen anwendet. Nichts Funktionales erkennbar.

    Aeh, Top-Down/Buttom-up wird auch in Funktionaler Programmierung, bei mathemathischen Beweisen etc. verwendet. Das hat nichts mit Prozeduren zu tun, sondern mit Design und Problemloesung.

    Der relevante Ausschnitt unserer Wirklichkeit ist 3D

    Fuer mich nicht und fuer die meisten auch nicht. Die zeitliche Komponente ist relevant und fest in unserer Vorstellung integriert. Es gibt vorher, nachher, Zeit und ich kann mittels Zeit Schlussfolgern. Z.B. wenn ich nicht um 15 Uhr am Bahnhof bin, dann faehrt mein Zug ab. Wenn ich den Ball so auf das Tor schiesse, dann hat der Torwart weniger Zeit in abzufangen, weil er grad auf seinem linken Bein steht, etc ... .

    ich mir "bildlich" kein 4D-Gebilde vorstellen kann

    Genau hier liegt das Problem, es ist kein Bild.

    PS:

    Darum hast du ja auch wohl das meiste davon ignoriert.

    Das passiert oefters. Und hat was damit zu tun, das eigene Vorstellungen mit denen im Text kollidieren, Text interpretiert wird, anstatt ihn so zu nehmen wie er ist oder einfach Missverstaendnisse vorliegen. Ich selbst bin auch nicht frei davon, bin mit aber des Problems bewusst. Nachsichtig sein ist meist meine Reaktion.



  • ProgChild schrieb:

    Ich habe allerdings schon genügend Gegenbeispiele geliefert.

    😮 zum Beispiel ?

    Ich ändere meine Ansicht, sobald ich auf ein stichhaltiges Gegenbeispiel treffe.

    ProgChild schrieb:

    Du hast nichts verstanden.
    Nochmal: Nur weil ich mir "bildlich" kein 4D-Gebilde vorstellen kann, so heißt das nicht, dass ich mir nichts 4-dimensionales vorstellen kann.

    Doch, genau das heißt es. Mehr ist leider nicht drin 😞

    Nicht mit einem Gehirn, das dem Überleben in einem Universum mit "nur" 3 relevanten Raumdimensionen dient.



  • btw.

    "if ... then" und "wenn ... dann" - in beiden Sprachen hat das zweite Wort sowohl eine logische (Implikation) als auch eine zeitliche/sequentielle Bedeutung.

    Na, klingelt's ?



  • u_ser-l schrieb:

    ProgChild schrieb:

    Ich habe allerdings schon genügend Gegenbeispiele geliefert.

    😮 zum Beispiel ?

    Lies doch nochmal, was ich geschrieben habe. Vielleicht merkst du es dann. Ich denke mir nicht noch mehr Gegenbeispiele aus.

    u_ser-l schrieb:

    ProgChild schrieb:

    Du hast nichts verstanden.
    Nochmal: Nur weil ich mir "bildlich" kein 4D-Gebilde vorstellen kann, so heißt das nicht, dass ich mir nichts 4-dimensionales vorstellen kann.

    Doch, genau das heißt es. Mehr ist leider nicht drin 😞

    Das tut mir Leid für dich, das für dich nicht mehr drin ist. Unsere Realität hat nun mal eine vierte Komponente die Zeit. Akzeptiere das oder lass es bleiben. Ich habe eine Vorstellung von Zeit und Raum.

    u_ser-l schrieb:

    "if ... then" und "wenn ... dann" - in beiden Sprachen hat das zweite Wort sowohl eine logische (Implikation) als auch eine zeitliche/sequentielle Bedeutung.

    Na, klingelt's ?

    In wie fern hat das denn was damit zu tun, dass der Mensch nicht prozedural, sondern Problem-Orientiert denkt?

    Du hast keine Ahnung von funktionaler Programmierung, oder? Schaue dir mal mein Beispiel mit der Summe von Zahlen an. Das Grundlegende Denken von Menschen basiert darauf ein Problem auf bekannte schon gelöste Probleme zurück zu führen. Und dieser Ablauf ist nicht prozedural.



  • u_ser-l schrieb:

    Eher normal ist 2D-Denken [... usw.]

    Ich glaube zu verstehen, was du meinst, aber korrigiere mich, wenn ich falsch liege. Mit einem Auge kann ich nur 2D sehen, mit 2 Augen 3D - geschenkt.

    Zeitliche Komponente. Und ich kann mir wunderbar einen Ball vorstellen, der durch die Luft fliegt.

    Ist der Punkt nicht, dass man mit der Vorstellung auch von ein Modell im Kopf redet? Es ist schon richtig, man kann man die Zeit nicht so sehen wie man Länge, Breite oder Tiefe sehen kann. Aber unser Gehirn ist ja auch keine Bildverarbeitungssoftware, sondern viel mehr ein Organ, dass aus gewonnen Informationen (z.B. den Bildern von den Augen) ein Modell erstellt. Und dieses Modell im Kopf beinhaltet oft sehr wohl eine zeitliche Komponente?
    Wenn ich bspw. auf der Landstraße so einen Schleicher überholen möchte und gaaanz weit hinten kommt ein anderes Auto. Meine Augen nehmen jeweils 2D/3D Bilder der Situation auf. Aber nach kurzem beobachten der Situation habe ich mir ein Modell der Situation im Kopf gebildet. Und darin muss die Zeit enthalten sein, denn ich kann ja abschätzen, ob mir die Zeit zum überholen ausreichen wird, oder nicht.
    Ist klar geworden worauf ich hinaus will?

    knivil schrieb:

    ihre Forschung im Bereich der Funktionalen Programmierung ist nur verzweifelte Aufholjagt.

    Na, das ist nicht ganz richtig. Allerdings merkt man auch nicht auf den ersten Blick wo Microsoft überall hintersteckt :). So wird z.B. der ghc (DER Haskell Compiler :)) federführend von Microsoftmitarbeitern entwickelt. Auch bei der Erstellung des Haskell98 Standards war Microsoft federführend. Der Vollständigkeit halber sollte man vielleicht noch erwähnen, dass es sich dabei um Microsoft Research handelt.



  • ja, das gute alte divide-and-conquer. Eigentlich eher eine Problemlösungs-Strategie als ein Äquivalent zu FP, aber es läßt sich bei gewissen Problemstellungen vorteilhaft einsetzen, und mit FP elegant formulieren, kein Zweifel. Und warum ist FP jetzt natürlicher als prozedurale oder OOP ? Weil sich bestimmte, oft abstrakte Probleme, damit eleganter formulieren lassen? Wie gesagt: FP ist eine nützliche Notation, aber deshalb noch nicht natürlich. Real-world-Probleme bestehen vorwiegend aus Zuständen und ereignisgesteuerten Zustands-Übergängen, Dinge, die mit FP mit umständlichen "Klimmzügen" zu modellieren sind. Das ist das Problem, und deshalb ist OOP oder prozedurale, jedenfalls zeitsequentielle Programmierung, natürlicher.

    Wie sortiert ein Kind Spielkarten? Bestimmt nicht rekursiv mit Quicksort. Eher einfach "immer die nächstgrößte Karte nach vorne" oder vielleicht mit Bubblesort.

    Das Ziege-Kohlkopf-Wolf-Problem beispielsweise läßt sich mit deklarativer Programmierung ad-hoc lösen, weil es bereits ein deklaratives Programm beschreibt. Dann ist nach Deiner Logik deklarative Programmierung natürlicher als prozedurale oder FP ?

    Einerseits bestehst du so auf der Zeit-Dimension als Bestandteil menschlichen Denkens, andererseits bestehst du darauf, daß der Zeitaspekt beim menschlichen Denken natürlicherweise gar keine Rolle zu spielen braucht, weil man die Sequentialität mit FP wegabstrahiert, und nach Deiner Theorie FP natürlicher ist als zeitsequentielle Notationen. Du widersprichst Dir irgendwie selbst.



  • mein vorangehendes Posting ist @ProgChild, hatte ich vergessen darüberzuschreiben 😃



  • u_ser-l schrieb:

    Einerseits bestehst du so auf der Zeit-Dimension als Bestandteil menschlichen Denkens, andererseits bestehst du darauf, daß der Zeitaspekt beim menschlichen Denken natürlicherweise gar keine Rolle zu spielen braucht, weil man die Sequentialität mit FP wegabstrahiert, und nach Deiner Theorie FP natürlicher ist als zeitsequentielle Notationen. Du widersprichst Dir irgendwie selbst.

    Nein. Du hörst mir nicht zu. Ich behaupte lediglich, dass der Mensch nicht sequenziell denkt.



  • Also ich kenne mich nicht mit Haskell aus, bin eher bei Scheme. Dort gibt es Zustaende. Wenn sie aber lokal sind, dann kann man es Closure nennen. Die sind echt toll, da sie fuer (gewoehnlich) keine Seiteneffekte haben. Gewiss hat Haskell sowas aehnliches, da Zustand auch immer in Parametern kodiert werden kann.

    Wie sortiert ein Kind Spielkarten?

    Wenn ein Computer Suchmaschinenanfragen oder -treffer so verarbeitet, wie ein Kind Spielkarten sortiert, dann wuerde google echt lange fuer eine Antwort brauchen.



  • frosch03 schrieb:

    Na, das ist nicht ganz richtig. Allerdings merkt man auch nicht auf den ersten Blick wo Microsoft überall hintersteckt :). So wird z.B. der ghc (DER Haskell Compiler :)) federführend von Microsoftmitarbeitern entwickelt. Auch bei der Erstellung des Haskell98 Standards war Microsoft federführend. Der Vollständigkeit halber sollte man vielleicht noch erwähnen, dass es sich dabei um Microsoft Research handelt.

    Hast du dazu eine Quelle? Ich konnte lediglich verifizieren, dass GHC-Entwickler nach mehreren Jahren an der Arbeit am GHC von Microsoft Research angestellt wurden und dort dann am GHC weiter gearbeitet haben.



  • knivil schrieb:

    Also ich kenne mich nicht mit Haskell aus, bin eher bei Scheme. Dort gibt es Zustaende. Wenn sie aber lokal sind, dann kann man es Closure nennen. Die sind echt toll, da sie fuer (gewoehnlich) keine Seiteneffekte haben. Gewiss hat Haskell sowas aehnliches, da Zustand auch immer in Parametern kodiert werden kann.

    In Haskell wird dieser Parameter einfach mit etwas "syntactic sugar" hinter einem Monad versteckt. So dass man am Ende, wenn man wollte einen Zustand verwenden könnte, ohne sich über das "woher" Gedanken machen zu müssen.



  • u_ser-l schrieb:

    Wie sortiert ein Kind Spielkarten? Bestimmt nicht rekursiv mit Quicksort. Eher einfach "immer die nächstgrößte Karte nach vorne" oder vielleicht mit Bubblesort.

    Soweit ich weiß, benutzen Menschen intuitiverweise etwas in der Gegend von Insertion Sort.

    Insertion Sort in Haskell (http://en.wikibooks.org/wiki/Haskell/Algorithm_complexity) ist natürlich ziemlich elegant. 🙂

    sort []  = []
    sort [x] = [x]
    sort (x:xs) = insert (sort xs)
        where insert [] = [x]
              insert (y:ys) | x <= y    = x : y : ys
                            | otherwise = y : insert ys
    


  • ProgChild schrieb:

    Ich behaupte lediglich, dass der Mensch nicht sequenziell denkt.

    Und ich bestreite das lediglich. Paralleles oder funktionales Denken ist eine intellektuelle Errungenschaft, die erlernt werden muß.

    Die Sprache verrät, wie der Mensch von Natur aus denkt:

    "if ... then"
    "wenn ... dann"
    

    "then" ebenso wie "dann" haben jeweils zwei Bedeutungen:

    1. eine logischen Bedeutung (im Sinne von "daraus folgt")

    2. eine zeitliche Bedeutung ("danach")

    Also ist selbst die einfache logische Operation der Implikation (, die Grundbestandteil jeden strategischen Denkens und gedanklichen Vorwegnehmens von Vorgängen der realen Welt ist,)
    gedanklich untrennbar mit zeitlicher Abfolge verbunden.

    Einen deutlicheren Beweis dafür, daß der Mensch von Natur aus sequentiell denkt, kann es kaum geben - zumindest im germanischen und angelsächsischen Sprachraum.



  • kann es einen klareren Beweis geben ? - wir haben dasselbe Wort für das Schlußfolgern und die zeitliche Vorstellung!



  • u_ser-l schrieb:

    ProgChild schrieb:

    Ich behaupte lediglich, dass der Mensch nicht sequenziell denkt.

    Und ich bestreite das lediglich. Paralleles oder funktionales Denken ist eine intellektuelle Errungenschaft, die erlernt werden muß.

    Wie ich schon erwähnt habe, sehe ich sehr viele Menschen, die Probleme haben prozedural zu denken. Erkläre mir das mal, wenn das so natürlich ist.

    u_ser-l schrieb:

    Einen deutlicheren Beweis dafür, daß der Mensch von Natur aus sequentiell denkt, kann es kaum geben - zumindest im germanischen und angelsächsischen Sprachraum.

    Wo ist da der Beweis. Bloß weil der Mensch eine zeitliche Konsequenz, wie eine logische Konsequenz sprachlich gleich setzt, heißt das doch noch lange dass er in zeitlichen Konsequenzen denkt. Oder dass er in logischen Konsequenzen denkt.

    Du hast hier einfach nur einen Begriff durch einen anderen Ersetzt. Der Beweis, dass ein Mensch deswegen genau so denke, den bleibst du weiterhin schuldig.



  • Menschliches Sprechen, Denken und Wahrnehmen sind drei Aspekte eines verbindenden Phänomens (Bewußtsein) und entwicklungsgeschichtlich untrennbar miteinander verwoben.

    Wir können von Natur aus im Grunde genommen nur das denken, was wir sagen oder wahrnehmen können. Alles Andere führen wir gedanklich durch Analogien und Projektionen auf "erfahrbare" Objekte zurück.

    Wobei sich die Analogien natürlich mit zunehmendem Abstraktionsgrad verselbständigen können, bis man kaum noch erkennen kann, welches Objekt der realen Welt zugrunde liegt (Beispiel aus der abstrakten Algebra: Anzahl (in der realen Welt) => (abstrakte) Zahl => Primideal ... )



  • u_ser-l schrieb:

    Menschliches Sprechen, Denken und Wahrnehmen sind drei Aspekte eines verbindenden Phänomens (Bewußtsein) und entwicklungsgeschichtlich untrennbar miteinander verwoben.

    Nehmen wir mal an, dass diese Behauptung wahr ist. Jetzt hast du gezeigt, dass zeitliche Konsequenzen und logische Konsequenzen von uns als ähnlich gesehen werden. Nur was sagt uns das darüber wie wir denken? Rein gar nichts! Das sagt nämlich nicht, wie wir darauf kommen, diese als ähnlich zu sehen. Und das sagt erst recht nichts darüber aus, wie ein Mensch daran geht, komplexe Probleme zu lösen.

    Und du hast meine Frage schon wieder ignoriert. Erkläre mir mal bitte, warum so viele Menschen mit der prozeduralen Denkweise Probleme haben, wenn sie doch so natürlich ist.



  • Eine Frage am Rande:

    Haskell ist rein Funktional; Scheme unterstützt mehrere Paradigmen. Aber es sollte sich doch in Scheme alles ebenso elegant mit FP darstellen lassen wie in Haskell, oder täusche ich mich da?

    Nach der Diskussion will ich unbedingt FP ansehen und ich bin am überlegen, mit welcher Sprache ich einsteigen soll. 😉



  • ProgChild schrieb:

    Nur was sagt uns das darüber wie wir denken? Rein gar nichts!

    Stark vereinfacht: Denken ~ Wahrnehmen ~ Sprechen ~ Denken ("~" heißt: "ist beeinflußt von")

    Die Diskussion dreht sich im Kreise: lambda t.x(D(t)))2+(y(D(t)))2 == 1 😃

    ProgChild schrieb:

    Erkläre mir mal bitte, warum so viele Menschen mit der prozeduralen Denkweise Probleme haben, wenn sie doch so natürlich ist.

    wieviele haben denn mit prozeduralem Denken mehr Probleme als mit funktionalem? Prozedurales Denken muß nicht einmal erlernt werden. Ich erinnere mich noch an "was passiert dann ?"-Sketche in einer Kindersendung (war es die Sesamstraße? ) An einen Sketch "welche Funktion ergibt sich, wenn man die folgenden beiden komponiert ?" kann ich mich allerdings nicht erinnern, zumindest nicht im Kinderprogramm. 😕


Anmelden zum Antworten