Was wäre ein gutes erstes funktionales Programmierprojekt? [geschlossen]

19

Was wäre ein gutes erstes funktionales Programmierprojekt?

Ich möchte mein Bachelor-Projekt mit einem Knall beenden und möchte es mit einem funktionalen Programmierprojekt beenden. Wir haben es nicht in der Schule gelernt, aber wir werden ermutigt, selbst zu versuchen, neue Dinge zu lernen, und ich dachte, ein neues Paradigma zu lernen, nicht nur eine neue Sprache, wäre eine großartige Übung für mich und wahrscheinlich auch für die Lehrer etwas Interessantes .

Das Problem ist, dass ich ein bisschen früher mit meinem Projekt beginnen möchte, um die Sommerferien zu nutzen, die funktionale Programmierung besser zu verstehen und mich mit einer Sprache vertraut zu machen.

Was würden Sie sagen, wäre ein Projekt für bewährte Praktiken, das ein bisschen herausfordernd ist, aber mich auch die Sprache, das Paradigma usw. lernen lässt. Und was würden Sie dann für ein gutes Projekt (ein fortgeschritteneres) für mein Bachelor-Projekt halten?

Vorschläge für die beste Sprache für den Einstieg in die funktionale Programmierung sind ebenfalls willkommen.

Meme
quelle
1
"Welche Sprache soll ich wählen?" Und Fragen zur Projektauswahl werden hier nicht behandelt. Bitte lesen Sie die FAQ und diese Metadiskussion für weitere Details.
Adam Lear

Antworten:

10

Wenn Sie sich für etwas relativ Mathematisches oder Logisches entscheiden, ist es im Allgemeinen einfacher - funktionale Programmiersprachen eignen sich im Allgemeinen gut für Anwendungen, die eine Form der Umwandlung von einer bestimmten Eingabe in eine Ausgabe darstellen.

Einige Ideen, in grober Reihenfolge der Schwierigkeit:

  • Genetische Algorithmen - Schreiben Sie ein Programm, das Lösungen für eine bestimmte Aufgabe entwickelt, wobei die Lösungen in einer einfachen DSL dargestellt werden. Ich hatte Spaß, bevor ich kleine Bots baute, die in einem 2D-Raster nach Nahrung suchen und verschiedene Strategien entwickeln

  • Parsing-Kombinatoren - Erstellen Sie eine Parser-Kombinator- Bibliothek, mit der Sie einen Parser für eine beliebige Sprache mit Funktionen höherer Ordnung erstellen können.

  • Wenn Sie wirklich eine Herausforderung suchen, können Sie versuchen, ein Computerspiel zu schreiben. Beachten Sie, dass dies eine schwierige Aufgabe ist, da Spiele eine große Menge an veränderlichen Zuständen aufweisen, deren Verwaltung in einem funktionalen Programmierstil schwierig sein kann. Erwarten Sie, mehr zu erfahren, als Sie jemals über Monaden usw. wissen wollten.

Ich würde Clojure als eine pragmatische funktionale Sprache empfehlen. Ich benutze es jetzt seit ungefähr 18 Monaten und bin mit der Wahl äußerst zufrieden. Hauptgründe sind:

  • Nebenläufigkeit - Clojure verfügt über ein erstaunliches STM-System, das meiner Ansicht nach derzeit die weltweit beste Sprache für die Nebenläufigkeit von mehreren Kernen darstellt. Sehen Sie sich das Video an unter: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey, wenn Sie verstehen möchten, warum dies so besonders ist
  • Es ist ein Lisp - aufgrund der "Code is Data" -Philosophie ist es fantastisch für die makrobasierte Metaprogrammierung (Programme, die Programme schreiben, genetische Algorithmen usw.)
  • Pragmatische Funktionsprogrammierung - Der Clojure-Stil ist sehr funktional (viel Gewicht auf Funktionen höherer Ordnung, Lazy Sequences usw.), aber er ist nicht ganz so rein wie Haskell. Es gibt viele nette Werkzeuge, um mit dem Zustand und den Nebeneffekten der Tabelle umzugehen
  • Dynamisch - Clojure ist standardmäßig eine dynamische Sprache. Ich halte das für einen großen Produktivitätsschub. Sie können jedoch optional zu einem späteren Zeitpunkt statische Typhinweise hinzufügen, wenn Sie die Leistungsvorteile der statischen Typisierung nutzen möchten.
  • Vollständig kompiliert - Clojure-Code wird immer eingehalten (auch wenn Sie eine "Auswertung" durchführen), sodass Sie eine recht anständige Leistung erzielen - mit Sicherheit besser als die meisten von mir verwendeten dynamischen Sprachen.
  • Sie erhalten kostenlosen Zugriff auf alle Bibliotheken und Tools im JVM-Ökosystem . Im Gegensatz zu akademischen Sprachen, für die nur sehr wenige Bibliotheken zur Verfügung stehen, können Sie also ziemlich einfach auf alles im Java-Universum zugreifen

Sie können die Grundlagen sehr einfach ausprobieren mit:

mikera
quelle
Ich habe Ihre Antwort für die Frage ausgewählt, weil sie alle meine Fragen beantwortet hat. Vielen Dank, dass Sie sich die Zeit genommen haben.
Meme
Haskell hat auch STM; (
Alternative
@mikera: Hast du ABCL für die Arbeit mit der JVM ausprobiert? Ich habe es ausprobiert und nur ein kleines Beispiel gemacht, aber ich habe fast keine Erfahrung damit. (Ich habe auch ein Clojure-Buch in meiner Aufgabenliste, aber dies ist eine andere Geschichte. Ich bin gespannt, ob Sie Erfahrung mit ABCL und Java haben.)
Giorgio
@ Giorgio: ABCL scheint eine anständige Implementierung von Common Lisp auf der JVM zu sein. OTOH Clojure hat den Vorteil, dass es für die JVM entwickelt wurde, viel mehr "moderne" Innovationen enthält und mehr Community-Dynamik besitzt. Ich denke, es kommt wirklich darauf an, ob es Ihnen wichtig ist, die Abwärtskompatibilität von Common Lisp aufrechtzuerhalten oder nicht.
Mikera
9

Bevor Sie sich mit konkreten Projekten befassen, lernen Sie zunächst die Grundlagen der funktionalen Programmierung kennen, damit Sie eine gute Vorstellung von den Projekttypen haben, die zu Ihnen passen.

Der beste Einstieg ist wahrscheinlich Die Struktur und Interpretation von Computerprogrammen (SICP), die auf dem Scheme-Dialekt von Lisp basiert. Dies ist ein klassischer CS-Text, und der vollständige Text ist online verfügbar (Link bereitgestellt).

Wenn Sie ausgefallen sein und eine modernere funktionale Sprache verwenden möchten, die auf die JVM abzielt, schauen Sie sich Clojure an. Es gibt sogar eine speziell für Clojure angepasste Version von SICP .

Wenn Sie den SICP-Text durchgehen, werden Sie eine Vorstellung davon bekommen, warum die funktionale Programmierung für bestimmte Aufgabentypen so gut geeignet ist, und die Übungen könnten ein vollwertiges Projekt inspirieren. Wenn Sie die Clojure Weg zu gehen wählen, und wollen einige bestehende Projekte zu untersuchen, gibt es einige gute Links hier .

Jason Lewis
quelle
Vielen Dank, dass Sie den Link für das Buch angegeben haben. Ich werde das lesen, um ein besseres Verständnis zu bekommen.
Meme
Haben Sie Ihre SICP heute gelesen?
MattyD
3

Quantitative Analyse

Wenn Sie das Finanzwesen für etwas interessant halten, ist es eine gute Ergänzung, ein paar quantitative Dinge mit funktionaler Programmierung zu tun, da diese sehr algorithmisch sind. Ich spreche von Portfoliotheorie und Dingen wie Sharpe und Sortino Ratios usw. Erstelle eine App, die die Renditen eines Fonds analysiert und verschiedene Statistiken, Diagramme usw. liefert.

Ich würde F # nur empfehlen, weil ich denke, dass es eine einfache funktionale Sprache ist, in der man anfangen kann, die über gute Tools und ein gutes Framework verfügt. Andere Alternativen sind Lisp und Clojure, aber sie sind etwas schwieriger zu erlernen.

Homde
quelle
Auf hohem Niveau ist es in der Tat wahr, dass Sie eine Menge Dinge auf funktionale Weise tun können. Menschen haben funktionale Sprachen verwendet, um zum Beispiel exotische Optionsauszahlungen zu beschreiben. Wenn Sie sich jedoch auf die Grundebene beschränken, wie z. B. die Berechnung von PCA, das Lösen nichtlinearer Gleichungen usw., werden die Algorithmen immer iterativer, und Sie sollten sie besser im alten Stil codieren.
quant_dev
1
Ich würde nicht sagen, dass es meiner Erfahrung nach bei der quantitativen Analyse darum geht, Algorithmen über Serien hinweg auszuführen. Ich habe Quant-Stuff in C # implementiert und es war sehr stark auf LINQ
abgestimmt
Was ist mit der Implementierung von Algorithmen selbst?
quant_dev
Ich sehe in den meisten Fällen kein Problem, oder? Berechnen Sie eine Sharpe Ratio, indem Sie zuerst eine annualisierte Rendite aus einer Renditeserie berechnen und dann diesen Wert mit einer risikofreien Rate und Volatilität verwenden: (annualizedReturn - riskFreeRate) / Volatilität. Nichts, was eine funktionale Sprache nicht bewältigen könnte
Homde
Was ist mit der Preismodellkalibrierung?
quant_dev
3

Für einen Vorsprung könnten Sie versuchen, ein kleines Blackjack-Spiel in F # zu implementieren. Dies ist ein Hausaufgabenprojekt, das in diesem kurzen Video-Tutorial erstellt wurde . Die Lösung finden Sie auch im Internet (und in einem der Videos).

knb
quelle
2

Sie könnten einen Interpreter für Schema oder Lisp mit OCaml schreiben.

davidk01
quelle
Zu diesem Thema gibt es sogar ein Buch über das Schreiben von Schemata in Hashell.
Alternative
2

An welche funktionale Sprache haben Sie gedacht? Jeder hat unterschiedliche Eigenschaften. Die eine Sprache, die mich am meisten beeindruckte, war Haskell, und ich würde vorschlagen, dass Sie dasselbe tun.


quelle
Ich habe ehrlich gesagt an F # gedacht, vor allem, weil in Dänemark bei Microsoft alles beliebt ist, aber je mehr ich unterschiedliche Meinungen lese, desto mehr bezweifle ich diese Entscheidung. Ich möchte eine Sprache, die mir hauptsächlich hilft, das Paradigma zu lernen, und nachdem ich mir sicher bin, ist es nicht schwer, eine andere Sprache zu lernen, wenn ich sie brauche oder will.
Meme
Kommt stark darauf an, wo du bist und was du tust. Für uns sind Microsoft-Programmiertechnologien nutzlos, da sie unsere Hauptplattform nicht unterstützen. Aber ich schweife ab: Wenn du F # verwenden willst, toll, dann öffne doch eine neue F # -spezifische Frage.
Ich möchte das nicht benutzen. Ich habe noch keine Entscheidung getroffen. Die Frage nach der zu verwendenden Sprache war ohnehin zweitrangig.
Meme
Suchen Sie in diesem Fall ein Projekt und fragen Sie nach Empfehlungen zur Lösung. Zum Beispiel eignet sich Prolog hervorragend für die Suche nach Entscheidungsbäumen. Haskell eignet sich hervorragend für den Mustervergleich. Lisp eignet sich hervorragend zum Erstellen und Bearbeiten von Lisp-Programmen zur Laufzeit, abhängig von Ihren Daten.
0

Sie könnten auch zu einem Open-Source-Projekt beitragen.

Im Programmiersprachenprojekt Frege gibt es zum Beispiel viel zu tun. Sie könnten sich zum Beispiel darum kümmern, Basis-Haskell-Bibliotheken zu portieren. Dies würde Sie zu einem Haskell-Experten machen, während Sie daran arbeiten.

Ingo
quelle