Ungeachtet der nicht verwalteten Sprachen, ist F# wirklich besser als C# für die Implementierung von Mathe? Und wenn das der Fall ist, warum?
Antworten
Zu viele Anzeigen?Ich denke, die meisten wichtigen Punkte wurden bereits von jemand anderem erwähnt:
- Mit F# können Sie Probleme so lösen, wie Mathematiker über sie denken
- Dank der Funktionen höherer Ordnung können Sie einfachere Konzepte verwenden, um schwierige Probleme zu lösen.
- Alles ist standardmäßig unveränderlich, was das Programm leichter verständlich macht (und auch leichter zu parallelisieren)
Es ist definitiv wahr, dass Sie einige der F#-Konzepte in C# 3.0 verwenden können, aber es gibt Einschränkungen. Sie können keine rekursiven Berechnungen verwenden (weil C# keine Tail-Rekursion hat), und das ist die Art und Weise, wie Sie primitive Berechnungen auf funktionale/mathematische Weise schreiben. Außerdem ist das Schreiben komplexer Funktionen höherer Ordnung (die andere Funktionen als Argumente annehmen) in C# schwierig, weil man explizit Typen schreiben muss (während in F# Typen abgeleitet, aber auch automatisch verallgemeinert werden, so dass man eine Funktion nicht explizit generisch machen muss).
Ich denke auch, dass der folgende Punkt von Marc Gravell kein gültiger Einwand ist:
Unter dem Gesichtspunkt der Wartung bin ich der Meinung, dass entsprechend benannte Eigenschaften usw. einfacher zu verwenden sind (über den gesamten Lebenszyklus) als Tupel und Kopf-/Schwanzlisten, aber das mag nur an mir liegen.
Das ist natürlich richtig. Das Tolle an F# ist jedoch, dass man mit dem Schreiben des Programms unter Verwendung von Tupeln und Kopf-/Schwanzlisten beginnen und es später im Entwicklungsprozess in ein Programm umwandeln kann, das .NET IEnumerables und Typen mit Eigenschaften verwendet (und ich glaube, so arbeitet der typische F#-Programmierer*). Mit Tupeln usw. und den interaktiven F#-Entwicklungswerkzeugen können Sie schnell Prototypen von Lösungen erstellen (und das ist bei mathematischen Aufgaben sehr wichtig, denn der größte Teil der Entwicklung besteht aus Experimenten, während Sie nach der besten Lösung suchen). Sobald Sie den Prototyp erstellt haben, können Sie den Code mit einfachen Quelltexttransformationen in einen F#-Typ verpacken (der auch in C# als gewöhnliche Klasse verwendet werden kann). F# bietet Ihnen auch viele Möglichkeiten, den Code später in Bezug auf die Leistung zu optimieren.
Dadurch profitieren Sie von den Vorteilen einfach zu verwendender Sprachen (z. B. Python), die viele Leute für die Prototyping-Phase nutzen. Allerdings müssen Sie später nicht das gesamte Programm neu schreiben, wenn Sie mit dem Prototyping in einer effizienten Sprache (z. B. C++ oder vielleicht C#) fertig sind, da F# sowohl "einfach zu bedienen" als auch "effizient" ist und Sie fließend zwischen diesen beiden Stilen wechseln können.
(*) Ich verwende diesen Stil auch in meinem Buch über funktionale Programmierung .
F# hat viele enorme Vorteile gegenüber C# im Zusammenhang mit mathematischen Programmen:
-
Mit interaktiven F#-Sitzungen können Sie Code on-the-fly ausführen, um sofort Ergebnisse zu erhalten und sie sogar visualisieren ohne eine vollständige Anwendung erstellen und ausführen zu müssen.
-
F# unterstützt einige Funktionen, die im Kontext der Mathematik zu massiven Leistungssteigerungen führen können. Besonders hervorzuheben ist die Kombination von
inline
und Funktionen höherer Ordnung ermöglichen es, mathematischen Code auf elegante Weise zu faktorisieren, ohne die Leistung zu beeinträchtigen. C# kann dies nicht ausdrücken. -
F# unterstützt einige Funktionen, die es ermöglichen, mathematische Konzepte viel natürlicher zu implementieren, als dies in C# möglich ist. Zum Beispiel ist es mit Tail Calls viel einfacher, Rekursionsbeziehungen einfach und zuverlässig zu implementieren. Auch das kann C# nicht ausdrücken.
-
Mathematische Probleme erfordern oft den Einsatz von anspruchsvolleren Datenstrukturen und Algorithmen. Das Ausdrücken komplizierter Lösungen ist mit F# im Vergleich zu C# wesentlich einfacher.
Wenn Sie eine Fallstudie wünschen, habe ich eine Implementierung der QR-Zerlegung über System.Double
aus 2kLOC C#. Die F# war nur 100 Zeilen Code, läuft über 10× schneller und ist über die Art der Zahl verallgemeinert, so dass es funktioniert nicht nur auf float32
, float
y System.Numerics.Complex
sondern kann sogar auf symbolische Matrizen angewendet werden, um symbolische Ergebnisse zu erhalten!
ÜBRIGENS, ICH Bücher schreiben zu diesem Thema sowie kommerzielle Software.
F# unterstützt Maßeinheiten die für Mathearbeiten sehr nützlich sein können.
Ich komme aus der Mathematik und habe mir F# angeschaut, aber für die meisten Zwecke bevorzuge ich immer noch C#. Es gibt ein paar Dinge, die F# einfacher macht, aber im Allgemeinen bevorzuge ich immer noch C# mit großem Abstand.
Einige der angepriesenen Vorteile von F# (Unveränderlichkeit, Funktionen höherer Ordnung usw.) können auch in C# genutzt werden (z. B. Delegates). Dies wird noch deutlicher, wenn man C# 3.0 mit Lambda-Unterstützung verwendet, die es sehr einfach und ausdrucksstark macht, funktionalen Code zu deklarieren.
Unter dem Gesichtspunkt der Wartung bin ich der Meinung, dass entsprechend benannte Eigenschaften usw. einfacher zu verwenden sind (über den gesamten Lebenszyklus) als Tupel und Kopf-/Schwanzlisten, aber das mag nur an mir liegen.
Einer der Bereiche, in denen sich C# in der Mathematik selbst im Stich lässt, sind die Generics und ihre Unterstützung für Operatoren. Also habe ich einige Zeit damit verbracht, dieses Problem zu lösen ;-p Meine Ergebnisse sind verfügbar in MiscUtil , mit Übersicht aquí .
Dieser Beitrag könnte relevant sein: http://fsharpnews.blogspot.com/2007/05/ffts-again.html
Auch: C# / F# Leistungsvergleich
Der größte Vorteil für reine Mathematik ist, was PerpetualCoder sagte, F# sieht eher wie ein mathematisches Problem aus, so dass es für einen Mathematiker einfacher zu schreiben ist. Es erinnerte mich sehr an MATLAB, als ich es mir ansah.
- See previous answers
- Weitere Antworten anzeigen