2008-11-01 9 views
12

Ich habe in letzter Zeit mit funktionaler Programmierung geforscht und gespielt, nur um mein Denken über Programmierung zu erweitern, weil ich das Denken "funktional" schwierig finde.Funktionale Programmierung: Beste Plattform/Umgebung

Ich habe Glasgow Haskell heruntergeladen und damit experimentiert.

Was ich frage mich ist, was ist die beste Plattform für Windows mit FP experimentieren? Ich würde einen JVM-basierten Ansatz bevorzugen, aber ein anderer Beitrag zu SO hat darauf hingewiesen, dass eine echte FP-Sprache nicht auf der JVM implementiert werden kann, da die Tail-Rekursion nicht unterstützt wird. Was sagst du?

EDIT: Wie gesagt, ich habe ein wenig mit Haskell experimentiert; Auf den Rat einer der Antworten habe ich die Scala-Website überprüft. Wenn ich mir die Scala-Beispiele anschaue, scheint der Code "vertrauter" zu sein (mein Hintergrund ist C und Java), aber er scheint entschieden eher OO/prozedural und weniger funktional zu sein. Ein großer Vorteil von Scala wäre, dass es mir ein anderes Sprachwerkzeug gibt, das ich neben Java einsetzen kann, und könnte ein weiterer Pfeil in meinem aktuellen professionellen Köcher werden, anstatt nur eine Lernübung zu sein. Wenn ich weiter in Scala komme, werden die funktionalen Aspekte dominanter werden, oder werde ich dazu neigen, nur OO-Code mit funktionalem Einfluss zu schreiben? Mit anderen Worten, wird Haskell meine Vorurteile härter und schneller herausfordern als Scala?

+0

* Ich würde einen JVM-basierten Ansatz bevorzugen, aber ein weiterer Beitrag zu SO hat gezeigt, dass eine echte FP-Sprache nicht auf der JVM implementiert werden kann. * Bitte beachten Sie diesen BS nicht. Auf der JVM gibt es funktionale Sprachen aller Arten und Arten: Scala, Clojure (lispy), Yeti (ML-ish) und Frege, eine nicht-strikte, rein funktionale Sprache, die auf Kompatibilität mit Haskell abzielt. Haskell ist also eine gute Wahl zum Lernen, und Sie können später Dinge mit Frege auf die JVM anwenden. – Ingo

Antwort

11

Wenn Sie wirklich lernen wollen, wie man funktional denkt, ist Haskell definitiv die richtige Wahl. So gut wie jede andere Sprache lässt Sie viel zu leicht in einen imperativen Stil schlüpfen. Haskell wird Sie zu einer funktionalen Denkweise zwingen. Ich fand das beim Lernen unentbehrlich. (Sie können natürlich disziplinierter sein als ich, aber warum sollten Sie Ihr Glück versuchen?)

Wenn Sie mit dem zufrieden sind, was Sie von Haskell gelernt haben (was eine Menge sein wird!), Dann sind Sie es bereit sein, liberalere funktionale Sprachen wie Clojure oder Scala auszuwerten. Oder du kannst bei Haskell bleiben, dessen Bibliothekssituation auch nicht so schlecht ist. An diesem Punkt ist es eine Frage der Umstände und persönlichen Vorlieben.Aber um eine solche Wahl zu treffen, ist es, glaube ich, wichtig, zuerst gelernt zu haben, wie man "rein" funktional denkt.

3

Betrachten Sie Scala. Es zielt auf die JVM ab, arbeitet mit Java zusammen und verfügt über viele funktionale Programmierfunktionen.

+0

Kiwi, als Antwort auf Ihren EDIT stimme ich den Anmerkungen von Matthias Benkard über die Gefahr zu, in einen imperativen Stil zu schlüpfen. Wenn Sie herausgefordert werden möchten, ist Haskell eine sehr gute Wahl. –

7

Ich empfehle PLT Scheme und SICP. Die Sprache ist so einfach, dass Sie sehr schnell zu den wichtigen Begriffen kommen können.

12

Auschecken F#. Die CLR hat eine .tail-Anweisung, so dass Sie F # -Code mit Tail-Aufrufen schreiben können, die keinen StackOverflow verursachen (die Ausnahme, nicht die Website). Here ist ein Intro-Video über F # von PDC.

3

I liebe mit Haskell und GHC. GHC enthält einen interaktiven Interpreter (GHCI) und hat wunderbar hilfreiche Fehlermeldungen. Plus Haskell ist eines der besten Beispiele für eine wirklich funktionale Sprache und nicht zu schlecht, um es zu benutzen, wenn man ein bisschen experimentiert. Plus es hat eine genial Typ System.

0

jemals probiert Prolog? ... das wird

?- bend(your_mind). 
Yes 


?- bend(X). 
X = your_mind 

Es gab mir eine ganz neue Perspektive sowieso ... plentyinfooutthere

+0

das ist keine funktionale Programmierung, ich denke nicht. – Claudiu

+0

Prolog ist eine logische Programmiersprache, die verwandt ist, aber keine funktionale Sprache. –

5

Schauen Sie auch bei Clojure.

+0

Danke; obwohl Lisp eine jener Sprachen ist, deren Grundform mich aus irgendeinem Grund nur anschneidet. –

+0

Kiwi: Ich dachte immer so, aber nachdem ich Common Lisp ernsthaft versucht hatte, schaute ich zurück und dachte: "Warum habe ich das nicht früher gemacht?" Ich empfehle ein Lisp nicht als Sprache, in der FP zu lernen, aber (siehe meine Antwort). Lisps Vorzüge liegen woanders. –

5

Mit anderen Worten, wird Haskell meine Vorurteile härter und schneller herausfordern als Scala?

Ja.

Wenn Sie wirklich lernen wollen, gehen Sie weit außerhalb Ihrer Komfortzone.

Wollen Sie wirklich Scala für den Produktionscode in den nächsten 3 Monaten verwenden?

6

Auf keinen Fall wird Scala Ihre Gedanken so weit verrückt machen wie Haskell. Der Hauptgrund, sich beim Lernen von FP für Scala gegenüber Haskell zu entscheiden, ist, sich vorsichtiger in die gefährliche Wildnis von Monaden, Funktoren und höherwertiger Güte einzuführen. Scala ist großartig, wenn du aus einem objektorientierten Hintergrund kommst und versuchst, dieses Wissen in funktionales Land zu verwandeln. Es ist nicht so toll, wenn du kopfüber in das tiefe Ende eintauchen willst.

Angesichts dessen, was Sie fragen, würde ich GHC Haskell empfehlen. Nichts wird deinen Kopf so sehr verzerren. :-) Trotzdem solltest du Scala noch im Auge behalten. Es gibt viele Aspekte der Sprache, die positiv einzigartig sind, insbesondere ihr Typsystem (strukturell + nominal subtyping == süß). Es wird Ihrem Kopf nicht so sehr weh tun wie Haskell, aber es wird Ihnen einen Einblick in einige Konzepte geben, die Sie sonst nirgends finden werden, insbesondere die so genannte "Typful-Programming" -Methodik.

Oh, und um den zweiten Teil Ihrer Frage zu beantworten (FP vs OO in Scala), tendiere ich dazu, meinen Code in einem funktionalen Stil innerhalb eines objektorientierten Frameworks zu schreiben. Es ist ein bisschen schwierig zu beschreiben, aber so ist es. Stellen Sie sich vor, dass Sie eine API von einem objektorientierten Standpunkt aus entwerfen, aber alles in einem funktionalen Stil implementieren. Ich halte die Dinge unveränderlich und verbringe viel Zeit mit Methoden höherer Ordnung, aber ich tue alles innerhalb der Grenzen von Vererbung und konventioneller nominaler Subtypisierung. Hin und wieder schreibe ich immer noch etwas Imperativ, aber nur, wenn es sauberer ist als den funktionalen Stil.

Verwandte Themen