Wie funktional ist C++11?
-
Wie funktional ist C++11?
-
Genau 13.2
-
Ich meine so Sachen wie:
- Closures
- Lambda-Kalkül
- Typsystem
- Funktionen höherer Ordnung
- ...
-
Oder: Wie wörtlich kann man ein Common Lisp-Programm in C++11 übersetzen?
-
ich dachte das heißt C++0x
-
was ist C++11 schrieb:
ich dachte das heißt C++0x
An 0x sind wir jetzt schon vorbeigerast
-
Wie funktional ist C++11? schrieb:
Wie funktional ist C++11?
Gar nicht. Closures in C++ sind was anderes als in Scheme, Lisp, Haskell oder ML. Das gleiche gilt fuer Typsystem und Funktionen hoeherer Ordnung zu.
-
Gar nicht. Closures in C++ sind was anderes als in Scheme, Lisp, Haskell oder ML. Das gleiche gilt fuer Typsystem und Funktionen hoeherer Ordnung zu.
Ach, darf sich jetzt nur noch das funktional nennen, was wie Lisp, Haskell oder ML aussieht? Natürlich sind C++11 Lambdas funktional und natürlich sind viele Funktionen aus <algorithm> higher-order functions.
Sie sind zwar lange nicht so mächtig und elegant wie ihre großen Brüder aus den funktionalen Sprachen, aber wie auch? Schließlich ist C++ im Kern nunmal eine imperative Sprache.
-
@irgendwer: Du hast offenbar keine Ahnung.
darf sich jetzt nur noch das funktional nennen, was wie Lisp, Haskell oder ML aussieht
Es geht um die Eigenschaften, die Funktionen in diesen Sprachen besitzen.
Natürlich sind C++11 Lambdas funktional
Nein! Sie sind nur anonyme Funktionen. Reine Bequemelichkeit, damit nicht extra eine Funktion oder Klasse deklariert werden muss. Funktionale Sprachen haben meist das Lambda-Kalkuel als Ausgangspunkt. Damit haben lambda-Funktionen in C++ rein gar nichts zu tun.
natürlich sind viele Funktionen aus <algorithm> higher-order functions
Sehr eingeschraenkt. Die entscheidene Moeglichkeit der Kombination wie bei
map
,filter
oderfold
fehlt. Desweiteren benutzen sie Iteratoren, sind also mit Seiteneffekten behaftet.Schließlich ist C++ im Kern nunmal eine imperative Sprache.
Deswegen ist C++ nicht funktional.
-
C++11 soll funktional sein? Soweit ich das in Erinnerung habe, ist C++ eine objektorientierte Sprache. Der Fokus liegt nicht (wie bspw. bei Haskell) auf Funktionen oder (wie bei C) in der Trennung von Daten und Code und der verstärken Kapselung dieser, sondern in der Zusammenführung von zusammengehörigen Daten und Code in nachgebauten Objekten der realen Welt.
Du kannst in C++ natürlich versuchen, so funktional wie möglich zu programmieren, aber das ist aufgrund der Eigenschaft der Sprache als objektorientiertes Programmiermittel eher kontraproduktiv. Schließlich liegt in diesem Konzept ja die Mächtigkeit der Sprache - Low-Level-Funktionen, die sich portabel implementieren lassen, eine hohe Abstraktionsebene bieten und trotzdem nahe C-Geschwindigkeit heranreichen.
-
Der aus dem Westen ... schrieb:
C++11 soll funktional sein? Soweit ich das in Erinnerung habe, ist C++ eine objektorientierte Sprache. Der Fokus liegt nicht (wie bspw. bei Haskell) auf Funktionen oder (wie bei C) in der Trennung von Daten und Code und der verstärken Kapselung dieser, sondern in der Zusammenführung von zusammengehörigen Daten und Code in nachgebauten Objekten der realen Welt.
Du kannst in C++ natürlich versuchen, so funktional wie möglich zu programmieren, aber das ist aufgrund der Eigenschaft der Sprache als objektorientiertes Programmiermittel eher kontraproduktiv. Schließlich liegt in diesem Konzept ja die Mächtigkeit der Sprache - Low-Level-Funktionen, die sich portabel implementieren lassen, eine hohe Abstraktionsebene bieten und trotzdem nahe C-Geschwindigkeit heranreichen.
Nicht funktional und imperativ verwechseln!
-
_matze schrieb:
Nicht funktional und imperativ verwechseln!
Nett, dass du darauf verlinkst, aber ich weiß nicht direkt, was du mir damit sagen willst ... soweit ich weiß, bedeutet funktionalen Programmierung, dass alle Elemente Funktionen sind. Schleifen und iterative Algorithmen sind also nicht möglich (?), daher ist die Rekursion der beste Freund.
Imperativ allerdings bedeutet wohl, dass es Daten und Funktion gibt, und die Funktionen ändern die Daten. Daraus folgt, dass man Code und Daten besser nicht mischen solle (soweit ich weiß, ist es nur am Anfang einer Funktion möglich, neue Variablen zu deklarieren, nach der ersten Anweisung ist das nicht mehr möglich), sondern besser trennen soll. Der Aufbau der Sprache C ist sehr imperativ, genau wie hinterher der Maschinencode der Anwendung - es gibt Code- und Datenregister, und die Werte im Coderegister ändern die Werte im Datenregister (wenn sie denn nicht auf einem Register, dem Stack oder dem Heap liegen).
-
knivil schrieb:
Natürlich sind C++11 Lambdas funktional
Nein! Sie sind nur anonyme Funktionen. Reine Bequemelichkeit, damit nicht extra eine Funktion oder Klasse deklariert werden muss. Funktionale Sprachen haben meist das Lambda-Kalkuel als Ausgangspunkt. Damit haben lambda-Funktionen in C++ rein gar nichts zu tun.
natürlich sind viele Funktionen aus <algorithm> higher-order functions
Sehr eingeschraenkt. Die entscheidene Moeglichkeit der Kombination wie bei
map
,filter
oderfold
fehlt. Desweiteren benutzen sie Iteratoren, sind also mit Seiteneffekten behaftet.Das halte ich für eine zu enge Sichtweise. Das C++ keine funktionale Sprache ist, steht außer Frage, trotzdem kann man in C++ funktional programmieren.
Beispiel:
erg = fold (+) $ filter (\x -> x % 2 == 0) [1..100]
#include <boost/range.hpp> erg = accumulate(filter(irange(1, 100), [](int x) { return x % 2 == 0; }), 0);
Natürlich nicht ganz so elegant, trotzdem funktionaler Stil. Lambdas aus C++0x sind da ein wichtiges Element. Und dass intern Nebeneffekte auftreten, spielt keine Rolle, das ist bei funktionalen Sprachen nicht anders.
Die Algorithmen aus <algorithm> kann man natürlich nicht so schön kombinieren, weil mit Iteratoren und nicht mit Ranges gearbeitet wird.
map, filter und fold finden sich übrigens als transform, copy_if (bzw. filter) und accumulate in der Standardbibliothek (bzw. in Boost).
-
Wurde nicht mal gezeigt, dass die Templatemetaprogrammierung Turing-vollständig ist? Da hätte man dann einen funktionalen Subteil von C++ und man kann alles damit machen. Ist natürlich (gelinde gesagt) ein bisschen unkomfortabel und ineffizient gegenüber den gängigen funktionalen Sprachen
.
-
Das halte ich für eine zu enge Sichtweise.
Und ich streube mich, wenn alles in einen Topf geworfen und umgeruehrt wird.
ipsec schrieb:
Das halte ich für eine zu enge Sichtweise. Das C++ keine funktionale Sprache ist, steht außer Frage, trotzdem kann man in C++ funktional programmieren.
Ich kann in fast jeder Sprache durch Disziplin funktional Programmieren. Es geht hier aber nicht um eine Bibliothek oder den persoenlichen Programmierstil sondern um die Sprache C++. What's your point?
#include <boost/range.hpp>
Dan kann ich auch gleich http://www.cc.gatech.edu/~yannis/fc++/ benutzen. Aber das ist eine Bibliothek und eben nicht C++ als Sprache.
Und dass intern Nebeneffekte auftreten, spielt keine Rolle, das ist bei funktionalen Sprachen nicht anders.
In funktionalen Sprachen ist das eine Konsequenz der Computerarchitektur, es hat nichts mit der Sprache zu tun. Bei den gezeigten Beispielen in C++ werden die Seiteneffekte in der Bibliothek versteckt, sind in der Sprache immer noch vorhanden.
Da hätte man dann einen funktionalen Subteil von C++ und man kann alles damit machen.
Funktionen bei Template Programmierung erfuellen nicht alle Kriterien von http://en.wikipedia.org/wiki/First-class_object. Auch ist hier eine nette Uebersicht zu finden: http://en.wikipedia.org/wiki/First-class_function .
-
knivil schrieb:
Es geht hier aber nicht um eine Bibliothek oder den persoenlichen Programmierstil sondern um die Sprache C++. What's your point?
#include <boost/range.hpp>
Dan kann ich auch gleich http://www.cc.gatech.edu/~yannis/fc++/ benutzen. Aber das ist eine Bibliothek und eben nicht C++ als Sprache.
Und dass intern Nebeneffekte auftreten, spielt keine Rolle, das ist bei funktionalen Sprachen nicht anders.
In funktionalen Sprachen ist das eine Konsequenz der Computerarchitektur, es hat nichts mit der Sprache zu tun. Bei den gezeigten Beispielen in C++ werden die Seiteneffekte in der Bibliothek versteckt, sind in der Sprache immer noch vorhanden.
Hier geht es um das Paradigma der funktionalen Programmierung. C++ ist keine funktionale Programmiersprache, da sind wir uns einig. Trotzdem ist ein funktionales Programmieren möglich (keine Nebeneffekte, keine Schleifen, keine Variablen usw.). Ob dabei der nötige Unterbau in einer Bibliothek oder im Compiler ist, spielt keine Rolle. Man kann mit C++ funktional programmieren.
knivil schrieb:
Da hätte man dann einen funktionalen Subteil von C++ und man kann alles damit machen.
Funktionen bei Template Programmierung erfuellen nicht alle Kriterien von http://en.wikipedia.org/wiki/First-class_object. Auch ist hier eine nette Uebersicht zu finden: http://en.wikipedia.org/wiki/First-class_function .
Welche Kriterien erfüllen sie denn nicht?
knivil schrieb:
Das halte ich für eine zu enge Sichtweise.
Und ich streube mich, wenn alles in einen Topf geworfen und umgeruehrt wird.
Das lässt sich nunmal nicht vermeiden. Die Programmierparadigmen (imperativ, objektorientiert, funktional, logisch usw.) sind als Paradigmen nicht an Sprachen oder Spracheigenschaften gebunden, sondern an der Art und Weise der Programmierung. Die einzelnen Programmiersprachen unterstützen jetzt bestimmte Paradigmen mehr oder weniger gut. Mit C++ kann ich nicht so elegant funktional programmieren wie in Haskell und in Haskell nicht so elegant objektorientiert wie in C++. Beides ist aber möglich.
-
Trotzdem ist ein funktionales Programmieren möglich
Das ist dein einziges Argument, und ein sehr schwaches obendrein, da es auf (fast) jede Sprache zutrifft. Und fuer micht spielt es eine Rolle, ob es die Sprache oder eine Bibliothek ist, ob es persoenlicher Programmierstil, Disziplin oder Spracheigenschaft ist.
Welche Kriterien erfüllen sie denn nicht?
can be constructed at run-time, was schwierig bei Templates ist.
Haskell nicht so elegant objektorientiert wie in C++
Haskell hat nur eine andere Auffassung von "objektorientiert" als C++ oder eben du. Diese Analogie hat nichts mit Funktionaler Programmierung zu tun. Bleib bitte beim Thema.
Das lässt [..] ist aber möglich.
Schwammig! Auf so etwas unkonkretes lasse ich mich nicht ein.
-
@irgendwer: Du hast offenbar keine Ahnung.
Danke.
Funktionale Sprachen haben meist das Lambda-Kalkuel als Ausgangspunkt. Damit haben lambda-Funktionen in C++ rein gar nichts zu tun.
Es geht auch nicht darum, dass C++ eine funktionale Sprache ist. Es geht um die Frage "Wie funktional ist C++11". Darauf würde ich antworten: Kaum, aber es gibt Elemente, die funktional sind.
Sehr eingeschraenkt.
Sag mal, ließt du eigentlich auch das ganze Posting? Direkt danach habe ich doch geschrieben, dass die Möglichkeiten in C++ funktional zu programmieren weit weniger mächtig und elegant als in echten funktionalen Sprachen sind.
Man sollte auch nicht vergessen, dass funktionales Programmieren ein Paradigma ist. Ich habe auch schon sehr (schlechten) "objektorientierten" Haskell-Code gesehen.
ipsec schrieb:
Mit C++ kann ich nicht so elegant funktional programmieren wie in Haskell und in Haskell nicht so elegant objektorientiert wie in C++. Beides ist aber möglich.
-
knivil schrieb:
Welche Kriterien erfüllen sie denn nicht?
can be constructed at run-time, was schwierig bei Templates ist.
Ganz Falscher Denkweg. Wenn du Compiletime und Runtime trennst, dann landest du in einer engstirnigen Welt. (Es gibt beim Ausliefern von Code soviele unterschiedliche Stellen wo Sachen passieren koennen. Beim Kompilieren, beim Linken, beim Deployment, vor dem 1. Aufruf, die ganze Zeit im Background,...)
Aber bitte: ich kontere mit einem c++ Interpreter. Templates werden zur Laufzeit erstellt (da wir ja keine Compiletime haben).
-
Irgendwer schrieb:
Man sollte auch nicht vergessen, dass funktionales Programmieren ein Paradigma ist. Ich habe auch schon sehr (schlechten) "objektorientierten" Haskell-Code gesehen.
Dabei ist der Support in Haskell doch al dente. Objektorientiertung ist keine Gegensatz zum funktionalen Paradigma.