Funktionale Programmierung mit Haskell
-
u_ser-l schrieb:
Die von Dir aufgezählten Argumente zu Gunsten von FP mögen alle richtig sein, nur hat FP den großen Nachteil, daß sie der menschlichen Intuition von "Algorithmus" zuwiderläuft, denn das natürliche algorithmische Denken des Menschen ist prozedural.
Das ist absoluter Blödsinn. Da ich im Moment in der Lehre tätig bin und Menschen sehe die zum ersten mal programmieren, sehe ich auch, wie schwierig die prozedurale Denkweise zu erlernen ist. Bloß weil du dich an sie gewöhnt hast, ist sie noch lange nicht natürlich.
u_ser-l schrieb:
Niemand schreibt von Natur aus seinen Einkaufszettel als funktionales Programm.
Niemand schreibt seinen Einkaufs-Zettel als prozedurales Programm. Denn die Sachen auf dem Zettel sind ja kein Programmablauf. Der Zettel stellt ja lediglich die Menge der Teile da, die du vor hast zu erwerben. Du wirst selten die Dinge in der Reihenfolge in den Einkaufskorb legen, wie sie auf dem Zettel stehen. Von daher: Blödes Beispiel.
Der Mensch denkt rekursiv und nicht prozedural. Beispiel: Das Bilden der Summe von Zahlen in einer Liste. So würde ein Mensch vorgehen:
Die Summe von zwei Zahlen kann ich. Die Summe von drei Zahlen ist die Summe von zwei Zahlen addiert mit einer weiteren Zahl... (spätestens beim nächsten mal merkt man) Die Summe von n Zahlen ist die Summe von (n-1) Zahlen plus eine weitere Zahl.
Und genau diese rekursive Denkweise setzen die Funktionalen Programmiersprachen um.
u_ser-l schrieb:
Dennoch kann man alles, was man mit FP programmieren kann, prinzipiell auch prozedural oder mit OOP programmieren, dafür sorgt die Church-Turing-Äquivalenz.
Ja richtig. Die frage ist nur, wie viel schwerer und umständlicher es ist.
-
ProgChild schrieb:
Da ich im Moment in der Lehre tätig bin und Menschen sehe die zum ersten mal programmieren, sehe ich auch, wie schwierig die prozedurale Denkweise zu erlernen ist. Bloß weil du dich an sie gewöhnt hast, ist sie noch lange nicht natürlich.
Mein Lieblingsbeispiel ist ja immer noch das folgende. Jemand wundert sich, dass dieses Programm nicht funktioniert:
int x; int y = x*x; cout << "Bitte x eingeben:"; cin >> x; cout << "Das Quadrat von x ist: " << y << endl;
Das Beispiel ist fiktiv, aber die Situation an sich hab ich schon zu oft erlebt, um es für einen Zufall zu halten. Denkt der Mensch am Ende deklarativ? (Oder hatten diejenigen Vorerfahrung mit Tabellenkalkulationen?;) )
-
Bashar schrieb:
Das Beispiel ist fiktiv, aber die Situation an sich hab ich schon zu oft erlebt, um es für einen Zufall zu halten. Denkt der Mensch am Ende deklarativ? (Oder hatten diejenigen Vorerfahrung mit Tabellenkalkulationen?;) )
Keine Ahnung. Aber die Situation, wie du sie beschreibst, hatte ich auch schon so ähnlich. Da sieht man wirklich, welche Dinge man alle als selbstverständlich annimmt, die es aber nicht sind.
-
ProgChild schrieb:
u_ser-l schrieb:
Dennoch kann man alles, was man mit FP programmieren kann, prinzipiell auch prozedural oder mit OOP programmieren, dafür sorgt die Church-Turing-Äquivalenz.
Ja richtig. Die frage ist nur, wie viel schwerer und umständlicher es ist.
Wenn du uns jetzt noch verrätst, warum es hier kein Unterforum zu einer funktionalen Sprache gibt..
-
ProgChild schrieb:
Da ich im Moment in der Lehre tätig bin und Menschen sehe die zum ersten mal programmieren, sehe ich auch, wie schwierig die prozedurale Denkweise zu erlernen ist. Bloß weil du dich an sie gewöhnt hast, ist sie noch lange nicht natürlich.
So ein Käse. Die prozedurale Denkweise muß nicht erlernt werden, sie ist dem Menschen von Natur aus mitgegeben, weil evolutionär entstanden.
Der Urmensch mußte auf der Jagd etliche "wenn ... dann"-Entscheidungen treffen und prozedural Jagdstrategien planen, um zu überleben. Das hat die natürliche Denkweise des Menschen maßgeblich geprägt.
Das Gehirn ist geschaffen, um zu überleben, und nicht, um elegante Formalismen wie FP zu denken. Und zum Überleben muß es seit jeher prozedural denken. Niemand erbeutet ein Mammut mit funktionalen Überlegungen und Monadentheorie.
ProgChild schrieb:
Niemand schreibt seinen Einkaufs-Zettel als prozedurales Programm.
So ein Käse. Jeder macht das. "1. Supermarkt Broccoli. 2. Bücherei 3. Blabla ..." Ich denke, das Prinzip ist klar (!)
ProgChild schrieb:
Der Mensch denkt rekursiv und nicht prozedural.
wenn FP der natürlichen Denkweise entspräche, hätte sie sich längst auf breiter Basis durchgesetzt, wahrscheinlich wäre FP vor Fortran und Cobol erfunden worden, und die Turingmaschine wäre für uns dann ebenso exotisch wie für die prozedural denkende Mehrheit der Lambda-Kalkül
-
Bashar schrieb:
int x; int y = x*x; cout << "Bitte x eingeben:"; cin >> x; cout << "Das Quadrat von x ist: " << y << endl;
Das Beispiel ist fiktiv, aber die Situation an sich hab ich schon zu oft erlebt, um es für einen Zufall zu halten. Denkt der Mensch am Ende deklarativ?
der mensch denkt, du hast mit der zeile
int y = x*x;
eine funktion definiert, in der er nur x einsetzen muss. hat er im matheunterricht so gelernt. er rechnet ja nicht damit, dass im computer immer alles von oben nach unten ausgeführt wird und die reihenfolge eine entscheidende rolle spielt.
-
u_ser-l schrieb:
wahrscheinlich wäre FP vor Fortran und Cobol erfunden worden
Der Lambda-Kalkül ist meines Wissens nach deutlich älter als Fortran und Cobol.
-
Zoom schrieb:
Bashar schrieb:
int x; int y = x*x; cout << "Bitte x eingeben:"; cin >> x; cout << "Das Quadrat von x ist: " << y << endl;
Das Beispiel ist fiktiv, aber die Situation an sich hab ich schon zu oft erlebt, um es für einen Zufall zu halten. Denkt der Mensch am Ende deklarativ?
der mensch denkt, du hast mit der zeile
int y = x*x;
eine funktion definiert, in der er nur x einsetzen muss. hat er im matheunterricht so gelernt. er rechnet ja nicht damit, dass im computer immer alles von oben nach unten ausgeführt wird und die reihenfolge eine entscheidende rolle spielt.Und genau das ist das schöne an Haskell: Man kann etwas hinschreiben und es funktioniert genau so, wie man es aus dem Mathe-Unterricht erwartet.
-
Christoph schrieb:
Und genau das ist das schöne an Haskell: Man kann etwas hinschreiben und es funktioniert genau so, wie man es aus dem Mathe-Unterricht erwartet.
kommt drauf an, was man will. entweder computer verstehen, oder computer benutzen.
-
u_ser-l schrieb:
So ein Käse. Die prozedurale Denkweise muß nicht erlernt werden, sie ist dem Menschen von Natur aus mitgegeben, weil evolutionär entstanden.
Der Urmensch mußte auf der Jagd etliche "wenn ... dann"-Entscheidungen treffen und prozedural Jagdstrategien planen, um zu überleben. Das hat die natürliche Denkweise des Menschen maßgeblich geprägt.
Nein. Du beschreibst Dinge die nacheinander ablaufen und behauptest, weil in der Welt die Dinge immer nacheinander ablaufen, so muss der Mensch auch genau so denken. Warum bitte sollte das so sein?
Sagen wir ein Mensch steht vor einer Mammut-Herde und will ein Mammut erlegen. Folgendes denkt er bestimmt nicht:
1. Trenne ein Mammut von der Herde
2. Erlege das MammutEr denkt folgendes: Ein einzelnes Mammut haben wir schonmal erlegt. Wir müssen also irgendwie ein Mammut von der Herde trennen.
Du merkst die natürliche Denkweise ist genau anders herum.
u_ser-l schrieb:
So ein Käse. Jeder macht das. "1. Supermarkt Broccoli. 2. Bücherei 3. Blabla ..." Ich denke, das Prinzip ist klar (!)
Eine Liste in Haskell bleibt ja auch weiterhin eine Liste. Die Sache ist doch wie du mit der Liste arbeitest.
u_ser-l schrieb:
wenn FP der natürlichen Denkweise entspräche, hätte sie sich längst auf breiter Basis durchgesetzt, wahrscheinlich wäre FP vor Fortran und Cobol erfunden worden, und die Turingmaschine wäre für uns dann ebenso exotisch wie für die prozedural denkende Mehrheit der Lambda-Kalkül
Badestrand schrieb:
Wenn du uns jetzt noch verrätst, warum es hier kein Unterforum zu einer funktionalen Sprache gibt..
Diese Frage lässt sich ganz einfach beantworten. Die Art wie die prozeduralen Programmiersprachen funktionieren ist die Art, wie die Computer funktionieren. Man hat mit Assembler angefangen und der Rest ist halt evolution. Es ist Tatsache, dass viele Dinge in C so sind, wie sie sind, weil man sie recht einfach in Maschienen-Befehle umsetzen kann.
Das hat aber rein garnichts zu tun, mit der Art und Weise, wie Menschen denken.
-
Zoom schrieb:
Christoph schrieb:
Und genau das ist das schöne an Haskell: Man kann etwas hinschreiben und es funktioniert genau so, wie man es aus dem Mathe-Unterricht erwartet.
kommt drauf an, was man will. entweder computer verstehen, oder computer benutzen.
Warum schließt du das aus? Man kann mit Haskell vielleicht nicht verstehen, wie ein Computer intern funktioniert. Das kann man mit C++ aber auch nicht. Wer das möchte, muss Assembler oder sogar Verilog (und Logik-Schaltungen) lernen.
Aber nachdem man die "Assembler-Phase" hinter sich gebracht und verstanden hat, wie das funktioniert, wird IMHO so gut wie niemand mit Assembler ein richtiges Programm schreiben.
Es interessiert in den meisten Fällen einfach nicht mehr, zu welchen Maschinencodes eine for-Schleife nun genau umgewandelt wird. Genauso kann man sagen, dass es in Haskell einfach nicht mehr interessant ist, in welcher Reihenfolge nun bestimmte Terme ausgewertet werden, solange das Ergebnis stimmt.
Warum sollte man Zeit investieren in etwas, was der Computer selbst herausfinden kann, wie z.B. die Auswertungs-Reihenfolge? [1]
[1] Von Ausnahmen natürlich abgesehen. Wenn man höchste Performance oder absolut deterministisches Verhalten möchte, führt eben kaum ein Weg an Assembler oder C vorbei.
-
ProgChild schrieb:
Er denkt folgendes: Ein einzelnes Mammut haben wir schonmal erlegt. Wir müssen also irgendwie ein Mammut von der Herde trennen.
Genau, und aus dieser Überlegung heraus wird er einen Plan fassen:
1. Trenne ein Mammut von der Herde
2. Erlege das MammutZerlegst Du eigentlich Deinen Alltag in lauter Teilprobleme, die Du dann völlig unabhängig voneinander in beliebiger Reihenfolge abarbeitest? Finde ich spannend. Ich persönlich nehme mir immer grobe Aufgaben vor, überlege mir aus welche Teilaufgaben zu bearbeiten sind und erledige dann eine nach der anderen.
-
Christoph schrieb:
Der Lambda-Kalkül ist meines Wissens nach deutlich älter als Fortran und Cobol.
eben. Wenn FP die natürliche Denkweise ist, und prozedural nicht, dann hätte Fortran eine funktionale Prog. Sprache sein müssen, die Theorie war ja seit den 30er Jahren bekannt.
Es ist eben kein Zufall, daß die frühen Rechenmaschinen, Webstühle, Hollerith-Maschinen, Zuse, Eniac, Autocode, Fortran, Cobol, ... und wie sie alle heißen, ausnahmslos Geräte und Formalismen sind, in denen Zustand und zeitliche Abfolge wesentliche Grundbestandteile sind: sie sind Mechanismen zur Automatisierung menschlichen Denkens, und arbeiten deshalb selbstverständlich prozedural/zeitsequentiell.
ProgChild schrieb:
Du beschreibst Dinge die nacheinander ablaufen und behauptest, weil in der Welt die Dinge immer nacheinander ablaufen, so muss der Mensch auch genau so denken. Warum bitte sollte das so sein?
Weil das menschliche Gehirn zum Überleben in unserer Umwelt entstanden ist, und deshalb von Natur aus nur auf Arten denken kann, die in irgendeiner überlebensrelevanten Beziehung zur Umwelt stehen - und in dem Universum, in dem ich lebe, geschehen Dinge, die in einer wahrnehmbaren Ursache-Wirkung-Beziehung stehen (jetzt bitte keine Quantentheorie und Rosen-Einstein-Paradoxa, wir reden von Urmenschen ^^), stets zeitlich nacheinander.
Warum wohl ist bildliches Denken in 3D relativ einfach, in 4D aber so schwer, daß nur wenige Spezialisten das können, und selbst diese denken oft in 3D-Projektionen ? Eben. Selbe Begründung.
-
ProgChild schrieb:
Badestrand schrieb:
Wenn du uns jetzt noch verrätst, warum es hier kein Unterforum zu einer funktionalen Sprache gibt..
Diese Frage lässt sich ganz einfach beantworten. Die Art wie die prozeduralen Programmiersprachen funktionieren ist die Art, wie die Computer funktionieren. Man hat mit Assembler angefangen und der Rest ist halt evolution. Es ist Tatsache, dass viele Dinge in C so sind, wie sie sind, weil man sie recht einfach in Maschienen-Befehle umsetzen kann.
Das hat aber rein garnichts zu tun, mit der Art und Weise, wie Menschen denken.
Tut mir Leid, das nehme ich dir so nicht ab. Es hat andere Gründe, dass sich prozedurale und objektorientierte Sprachen stark durchgesetzt haben, funktionale Sprachen eben nicht. Die Umsetzbarkeit in Maschinencode ist kein Argument, sobald ein Compiler für die Sprache steht und das Kompilat ausreichende Geschwindigkeit aufweist. So jung ist die Informatik auch wieder nicht, als dass sich die funktionale Programmierung nicht durchsetzen könnte, bei den Vorteilen die gepriesen werden. Und das ist auch das, was mich an solchen Threads wie diesem stört: Glaubt man den Posts hier und aus ähnlichen Threads, müssten alle Programmierer funktional programmieren, da es einfacher zu erlernen ist, Bugs praktisch nicht vorkommen, Ergebnisse schneller vorliegen und so weiter und so fort.
Die Konzepte der funktionalen Programmierung sind durchaus interessant, funktionale Sprachen haben definitiv ihre Existenzberechtigung und finden ihre Nischen. Nichtsdestotrotz ist funktionale Programmierung eben nicht die eierlegende Wollmilchsau und nicht die Lösung für alles.
-
u_ser-l schrieb:
Weil das menschliche Gehirn zum Überleben in unserer Umwelt entstanden ist, und deshalb von Natur aus nur auf Arten denken kann, die in irgendeiner überlebensrelevanten Beziehung zur Umwelt stehen - und in dem Universum, in dem ich lebe, geschehen Dinge, die in einer wahrnehmbaren Ursache-Wirkung-Beziehung stehen (jetzt bitte keine Quantentheorie und Rosen-Einstein-Paradoxa, wir reden von Urmenschen ^^), stets zeitlich nacheinander.
Moment. "Ursache-Wirkung" und "zeitlich nacheinander" ist nicht das gleiche.
Sprachen wie C++ und Java modellieren den Aspekt des "zeitlich nacheinander".
Funktionale Sprachen modellieren aber gerade das "Ursache-Wirkung"-Prinzip.In funktionalen Sprachen wird die Reihenfolge implizit durch Datenabhängigkeiten dargestellt. Das ist aber nichts anderes als das Ursache-Wirkungs-Prinzip; die daraus resultierende zeitliche Abfolge ist nur ein Nebeneffekt.
-
Leute ich muss sagen, ich finde die Diskussion total spannend
das natürliche algorithmische Denken des Menschen ist prozedural
Möglicherweise ist genau hier das Problem. Gibt es überhaupt "das natürliche denken?" Ich denke nämlich, dass Menschen unterschiedliche Neigungen haben, etwas als "einfach" zu empfinden. Vielleicht fällt es dir sehr einfach, imperativ vorzugehen, mir oft nicht
Im übrigen spricht man von der Church-Turing-These, da diese nicht bewiesen ist / nie bewiesen werden kann. [1]
Niemand schreibt von Natur aus seinen Einkaufszettel als funktionales Programm.
Vielleicht ist die Einkaufsliste auch nicht das beste Beispiel, da sie ja eigentlich keine Reihenfolge vorschreibt. Vielmehr ist das eine Aufzählung.
Währe ein Kochrezept nicht ein besseres Beispiel? Und da muss ich dir dann auch recht geben, da stehen in der tat sequentielle Anweisungen drauf. Ein missachten der Reihenfolge währe fatal (man stelle sich vor, ich brate die Eier bevor ich sie aufgeschlagen habe :)). Allerdings hat ein Rezept auch nur dort eine Reihenfolge, wo es notwendig ist. Das Würzen z.B. beinhaltet keine Reihenfolge, denn es ist ja auch egal, ob ich Salz vorm Pfeffer verwende oder umgekehrt. Lediglich wann gewürzt werden soll ist festgelegt.
Aber genau das ist auch die Strategie, die in der funProg zum Einsatz kommt. Und es ist verwunderlich, wie wenig doch eine Reihenfolge benötigt. Und oftmals existiert die Reihenfolge auch nur, weil doch immer noch sehr viel prozedural/imperativ programmiert wird. Da ist dann oft noch kurz das Hirn anstrengen angesagt und dann findet man auch seine funProg Lösung. Spannend ist, dass diese sehr häufig eleganter, kürzer und einfacher zu verstehen ist!
Naja, und da wo man tatsächlich mit Seiteneffekten arbeiten muss werden halt Monaden verwendet. Aber Monaden sind auch nicht das Werkzeug aus dem Gruselkabinett (so wie es hier oft klingt). Es ist natürlich richtig, dass Monaden ihre Herkunft in der Kategorientheorie haben. Allerdings kann man auch wunderbar mit Monaden arbeiten ohne die Kategorientheorie studiert zu haben (auch wenn es spannend ist :)). Man kann ja auch mit Datentypen arbeiten, ohne Mengenlehre studiert zu haben (auch wenn auch das spannend ist :)).
müssten alle Programmierer funktional programmieren, da es [einige Vorteile...]
Nur weil etwas sehr gut ist, bedeutet es noch lange nicht, dass es von der Mehrheit angenommen wird. Und niemand sagt, dass andere Paradigmen nicht auch gut sind. Was man allerdings durchaus beobachten kann ist, dass sehr viele Sprachen Konzepte aus der funProg übernehmen. Von daher ist an den ganzen Vorteilen sicher etwas dran.
P.S.: Glaubt ihr echt, dass die Urmenschen tatsächlich so bewusst vorgegangen sind? Ich eigentlich nicht.
-
Schöner Post
frosch03 schrieb:
Nur weil etwas sehr gut ist, bedeutet es noch lange nicht, dass es von der Mehrheit angenommen wird. Und niemand sagt, dass andere Paradigmen nicht auch gut sind.
Nunja, es wird ja nicht nur gesagt, funktionale Programmierung sei sehr gut, sondern in vieler Hinsicht "besser" als die "etablierten" Sprachen. Da wundert man sich doch wohl zurecht, dass funktionale Programmierung noch nicht Mainstream ist Fragt sich, wo hapert's an der Praxistauglichkeit?
-
... deshalb von Natur aus nur auf Arten denken kann, die in irgendeiner überlebensrelevanten Beziehung ... wir reden von Urmenschen
Unter diesen Voraussetzungen wuerde es den Menschen, das kreative Wesen, heute nicht geben. Desweiteren finde ich die Argumentation mittels Evolution und Urmenschen reichlich daneben. Auch kann ein Mensch nur eins nach dem anderen abarbeiten, Rechner haben diese Beschraenkung nicht (und das nicht erst, seit dem es Multiprozessormaschinen gibt).
Funktionale Programmierung bieten grossartige Moeglichkeiten, Ablaeufe automatisch zu parallelisieren. Eine Unigruppe beschaeftigt sich bei mir grad mit der automatischen Parallelisierung von C-Programmen und die kotzen staendig ab. Eine weitere Staerke ist auch die Beweisbarkeit von Programmen. Bei Software in Flugzeugen, Satelieten etc. braucht man 100% korrekten Code. Auch gibt es Systeme fuer die Ableitung von Algorithmen zu einem gegebenen mathematischen Problem. Automatisches Testen etc ... kann auch vereinfacht werden. Desweiteren gibt es genug Lisp->C Coompiler (optimierend), falls Performance dann doch nicht ausreicht.
Ein Grund, warum Lisp nicht aktuell ist, ist vielleicht, dass all die Features natuerlich auch Performance kosten und der akademische Touch.
Nichtsdestotrotz ist funktionale Programmierung eben nicht die eierlegende Wollmilchsau
Eingefleischte Anhaenger von Lisp sehen das anders. Es gibt einfach alles. (Ich bin kein eingefleischter Anhaenger, eher Anfaenger) Man kann aber viel von solchen Sprachen lernen. Und genau das passiert, funktionale Elemente halten vermehrt Einzug in neue und alte Sprachen.
Und zu Microsoft: Die haben eindeutig den Zug verpasst, ihre Forschung im Bereich der Funktionalen Programmierung ist nur verzweifelte Aufholjagt. F# gibt es auch noch nicht so lange im Vergleich zu anderen Funktionalen Programmiersprachen.
Einen kurzen Ueberblick kann man sich hier verschaffen: http://www.artima.com/weblogs/viewpost.jsp?thread=251474
-
knivil schrieb:
Und zu Microsoft: Die haben eindeutig den Zug verpasst, ihre Forschung im Bereich der Funktionalen Programmierung ist nur verzweifelte Aufholjagt. F# gibt es auch noch nicht so lange im Vergleich zu anderen Funktionalen Programmiersprachen.
Welcher große Softwarehersteller forscht denn sonst so im Bereich FP? Du hattest Google erwähnt, spielst wahrscheinlich auf Map-Reduce an. Da ist aber nur die Idee funktional, die haben das dann natürlich in einer imperativen Sprache (C++ AFAIK) implementiert.
Und F# würde ich nicht als Forschungsbeitrag interpretieren, das ist ja im wesentlichen eine Anpassung von OCaml an Mainstream-Bedürfnisse. Guck dir lieber an, was sie im Bereich Haskell machen.
-
Jester schrieb:
Genau, und aus dieser Überlegung heraus wird er einen Plan fassen:
1. Trenne ein Mammut von der Herde
2. Erlege das MammutJa genau. Aber diese Formulierung erfordert einen Zusätzlichen Denk-Schritt. Und jetzt denken wir mal weiter. Jetzt will der Urmensch seinen Begleitern klar machen, was zu tun ist. Sagt ihnen einfach nur die beiden Schritte, werden sie sich fragen, warum die beiden Schritte sinnvoll sind. Formuliert er sie so, wie ich oben, verstehen sie sofort, dass es sinnvoll ist.
Jester schrieb:
Zerlegst Du eigentlich Deinen Alltag in lauter Teilprobleme, die Du dann völlig unabhängig voneinander in beliebiger Reihenfolge abarbeitest? Finde ich spannend. Ich persönlich nehme mir immer grobe Aufgaben vor, überlege mir aus welche Teilaufgaben zu bearbeiten sind und erledige dann eine nach der anderen.
Genau das ist der Punkt. Du hast erst ein großes Problem, welches du in Dinge zerlegst, die du in einem Schritt lösen kannst. Das was am Ende dabei raus kommt ist eine sinnvolle Reihenfolge. Den Sinn der Reihenfolge versteht aber nur der, der deine vorherige Überlegung kennt und der weiß, was das große Problem ist, was es zu lösen gibt.
Was ich sagen will: Die Überlegungen finden nicht prozedural statt. Das Ergebnis mag hinterher ein prozeduraler Ablauf sein, aber das sagt ja gar nichts darüber aus, wie der zustande gekommen ist.
Vielleicht nochmal der Einkaufszettel. Bloß weil ich am Ende die Dinge in der Reihenfolge auf dem Zettel stehen habe, wie ich sie später erledigen will, so heißt es noch lange nicht, dass sie mir in genau der Reihenfolge eingefallen sind. Das wäre sogar sehr verwunderlich.
u_ser-l schrieb:
Es ist eben kein Zufall, daß die frühen Rechenmaschinen, Webstühle, Hollerith-Maschinen, Zuse, Eniac, Autocode, Fortran, Cobol, ... und wie sie alle heißen, ausnahmslos Geräte und Formalismen sind, in denen Zustand und zeitliche Abfolge wesentliche Grundbestandteile sind: sie sind Mechanismen zur Automatisierung menschlichen Denkens, und arbeiten deshalb selbstverständlich prozedural/zeitsequentiell.
Diese Dinge sind alle sequenziell, weil wir keine Möglichkeit haben, sie nicht sequenziell zu gestalten. Ich stimme nur absolut nicht mit dir überein, dass das genau dem Menschlichen denken entspricht. Wenn ich eine Saftpresse erfinde, dann bedeutet das ja auch nicht, dass ich genauso denke, wie meine Saftpresse funktioniert. Ich denke nicht in Form von Orangen-Hälften. Und nur weil meine Saftpresse Strom braucht um zu funktionieren, so heißt das noch lange nicht, dass ich Strom brauche, um das selbe zu tun.
u_ser-l schrieb:
Weil das menschliche Gehirn zum Überleben in unserer Umwelt entstanden ist, und deshalb von Natur aus nur auf Arten denken kann, die in irgendeiner überlebensrelevanten Beziehung zur Umwelt stehen - und in dem Universum, in dem ich lebe, geschehen Dinge, die in einer wahrnehmbaren Ursache-Wirkung-Beziehung stehen (jetzt bitte keine Quantentheorie und Rosen-Einstein-Paradoxa, wir reden von Urmenschen ^^), stets zeitlich nacheinander.
Das mag schon sein. Nur wenn ich etwas baue, dann interessiert mich eine Wirkung. Das heißt ich muss nach den Ursachen suchen, die später meine Wirkung erzeugen. Dass ich diese natürlich ausführen muss, bevor ich die Wirkung erhalte ist klar. Das sagt aber gar nichts darüber aus, wie ich darauf gekommen bin.
Glaubst du Otto hatte als erstes die Teile zusammen, die er brauchte um seinen Motor zu bauen und hat sich dann überlegt, was er damit anstellt? Nein! Er wollte einen Motor bauen und hat sich dann überlegt, welche Teile er dafür braucht und diese dann beschafft.
u_ser-l schrieb:
Warum wohl ist bildliches Denken in 3D relativ einfach, in 4D aber so schwer, daß nur wenige Spezialisten das können, und selbst diese denken oft in 3D-Projektionen ? Eben. Selbe Begründung.
Falsch. Bildliches denken ist per Definition 3D. Darum ist es schwierig. Bloß weil ich mit einem Toaster keine Pizza backen kann, heißt es noch lange nicht, dass es unmöglich ist, eine Pizza zu backen. Der Toaster ist bloß das falsche Instrument. Genauso wie bildliche Vorstellung hier fehl am Platz ist.
Bloß weil du nur 3-dimensionale Dinge sehen kannst, heißt das doch noch lange nicht, dass du nicht 4-dimensional denken kannst. Unsere Wirklichkeit ist 4D. Es gibt nämlich noch eine Zeitliche Komponente. Und ich kann mir wunderbar einen Ball vorstellen, der durch die Luft fliegt.
Badestrand schrieb:
Tut mir Leid, das nehme ich dir so nicht ab. Es hat andere Gründe, dass sich prozedurale und objektorientierte Sprachen stark durchgesetzt haben, funktionale Sprachen eben nicht. Die Umsetzbarkeit in Maschinencode ist kein Argument, sobald ein Compiler für die Sprache steht und das Kompilat ausreichende Geschwindigkeit aufweist. So jung ist die Informatik auch wieder nicht, als dass sich die funktionale Programmierung nicht durchsetzen könnte, bei den Vorteilen die gepriesen werden.
Ich denke schon, dass man die evolutionäre Komponente nicht vernachlässigen sollte. Jemand der einen Compiler schreibt hat vorher jahrelang mit einer Imperativen-Sprache programmiert. Er hat das Konzept verinnerlicht und er kann gut damit umgehen. Kein Wunder, dass seine neue Sprache wieder eine imperative ist.
Badestrand schrieb:
Und das ist auch das, was mich an solchen Threads wie diesem stört: Glaubt man den Posts hier und aus ähnlichen Threads, müssten alle Programmierer funktional programmieren, da es einfacher zu erlernen ist, Bugs praktisch nicht vorkommen, Ergebnisse schneller vorliegen und so weiter und so fort.
Nein. Alles hat seine Vor- und seine Nachteile. Und die sollte man auch nicht Verschweigen. Wenn man wirklich Performance braucht, so führt immer noch kein Weg an C++ vorbei. Und wenn es ganz schnell sein muss auch kein Weg an Assembler vorbei.
Ich glaube auch nicht, dass man wahnsinnig viel schneller ist. Was ich allerdings denke: Die Programme haben weniger Fehler. Und wenn man sich einmal daran gewöhnt hat, so sind sie auch erheblich leichter zu lesen, als imperative Programme.
Dafür hat man vielleicht im Schnitt einen Performance-Verlust um den Faktor 2. Aber es gibt ja Leute, die in Python oder ähnlichem programmieren. Die behaupten ja immer, dass sie das Allheilmittel gefunden haben. Aber gerade Python ist um den Faktor 30-40 langsamer. Von daher...
Badestrand schrieb:
Die Konzepte der funktionalen Programmierung sind durchaus interessant, funktionale Sprachen haben definitiv ihre Existenzberechtigung und finden ihre Nischen. Nichtsdestotrotz ist funktionale Programmierung eben nicht die eierlegende Wollmilchsau und nicht die Lösung für alles.
Funktionale Programmiersprachen können genauso General Purpose sein, wie C++. "Die" Lösung für alles gibt es nicht. Aber ich sehe sie auch nicht in irgendwelchen Nischen. Man kann nämlich auch anders herum argumentieren: Obwohl die ganzen Programmierer imperative Programmierung gewöhnt sind und lieber ihre imperativen Programmiersprachen verbessern, so ist das Konzept der funktionalen Programmierung trotzdem erhalten geblieben. Und es gibt immer wieder Leute, die dafür einen neuen Compiler schreiben.
Und noch was. Bezüglich C++ und funktionale Programmierung. C++ hat eine Menge an funktionalen Features. Vor allem die STL. Die setzt nämlich mit ihren Funktoren nämlich genau das um, dass man eine Funktion eine Funktion übergibt, um etwas zu tun. Oder denkt man an die IO-Streams. Die Streams sind Monaden und sie werden einfach benutzt ohne irgendwelche Zweifel.