Viele der anderen Antworten haben sich auf die Performance-Seite (Parallelität) der funktionalen Programmierung konzentriert, was meiner Meinung nach sehr wichtig ist. Sie haben jedoch speziell nach der Produktivität gefragt, da Sie in einem funktionalen Paradigma dasselbe schneller programmieren können als in einem imperativen Paradigma.
Ich finde tatsächlich (aus persönlicher Erfahrung), dass das Programmieren in F # meiner Meinung nach besser entspricht und es daher einfacher ist. Ich denke, das ist der größte Unterschied. Ich habe sowohl in F # als auch in C # programmiert, und es gibt viel weniger "Kampf gegen die Sprache" in F #, was ich liebe. Sie müssen nicht über die Details in F # nachdenken. Hier sind einige Beispiele von dem, was mir wirklich Spaß macht.
Obwohl beispielsweise F # statisch typisiert ist (alle Typen werden zur Kompilierungszeit aufgelöst), ermittelt die Typinferenz, welche Typen Sie haben, sodass Sie es nicht sagen müssen. Und wenn es es nicht herausfinden kann, macht es automatisch Ihre Funktion / Klasse / was auch immer generisch. Sie müssen also nie etwas Generisches schreiben, es ist alles automatisch. Ich finde, das bedeutet, dass ich mehr Zeit damit verbringe, über das Problem nachzudenken und weniger darüber, wie ich es umsetzen kann. Wenn ich zu C # zurückkehre, vermisse ich diese Art von Folgerung wirklich. Man merkt nie, wie ablenkend sie ist, bis man sie nicht mehr tun muss.
Anstatt in Schleifen Schleifen zu schreiben, rufen Sie auch Funktionen auf. Es ist eine subtile Änderung, aber bedeutsam, weil Sie nicht mehr über das Schleifenkonstrukt nachdenken müssen. Hier ist zum Beispiel ein Code, der durchgeht und mit etwas übereinstimmt (ich kann mich nicht erinnern, was, es ist aus einem Projekt-Euler-Puzzle):
let matchingFactors =
factors
|> Seq.filter (fun x -> largestPalindrome % x = 0)
|> Seq.map (fun x -> (x, largestPalindrome / x))
Mir ist klar, dass es recht einfach wäre, einen Filter und dann eine Karte (das ist eine Konvertierung jedes Elements) in C # durchzuführen, aber Sie müssen auf einer niedrigeren Ebene denken. Insbesondere müssten Sie die Schleife selbst schreiben und Ihre eigene explizite if-Anweisung und solche Dinge haben. Seit ich F # gelernt habe, habe ich festgestellt, dass es einfacher ist, auf funktionale Weise zu codieren. Wenn Sie filtern möchten, schreiben Sie "filter", und wenn Sie zuordnen möchten, schreiben Sie "map", anstatt zu implementieren jedes der Details.
Ich liebe auch den Operator |>, der meiner Meinung nach F # von ocaml und möglicherweise andere funktionale Sprachen trennt. Es ist der Pipe-Operator, mit dem Sie die Ausgabe eines Ausdrucks in die Eingabe eines anderen Ausdrucks "leiten" können. Es lässt den Code folgen, wie ich mehr denke. Wie im obigen Code-Snippet heißt es: "Nehmen Sie die Faktorenfolge, filtern Sie sie und ordnen Sie sie dann zu." Es ist ein sehr hohes Maß an Denken, das Sie nicht in einer zwingenden Programmiersprache erhalten, weil Sie so beschäftigt sind, die Schleife und if-Anweisungen zu schreiben. Es ist das Einzige, was ich am meisten vermisse, wenn ich in eine andere Sprache gehe.
Obwohl ich sowohl in C # als auch in F # programmieren kann, fällt es mir im Allgemeinen leichter, F # zu verwenden, da Sie auf einer höheren Ebene denken können. Ich würde argumentieren, dass ich produktiver bin, weil die kleineren Details aus der funktionalen Programmierung entfernt werden (zumindest in F #).
Bearbeiten : Ich habe in einem der Kommentare gesehen, dass Sie nach einem Beispiel für "state" in einer funktionalen Programmiersprache gefragt haben. F # kann zwingend geschrieben werden. Hier ist ein direktes Beispiel dafür, wie Sie einen veränderlichen Zustand in F # haben können:
let mutable x = 5
for i in 1..10 do
x <- x + i