Als meine erste Programmiersprache habe ich beschlossen, Haskell zu lernen. Ich bin Hauptfach Analytische Philosophie, und Haskell hat mir ermöglicht, schnell und korrekt Programme von Interesse zu erstellen, z. B. Wandler für das Parsen natürlicher Sprachen, Theoremprüfer und Interpreten. Obwohl ich erst seit zweieinhalb Monaten programmiere, fand ich Haskells Semantik und Syntax viel einfacher zu lernen als traditionellere imperative Sprachen und fühlte mich (jetzt) mit den meisten Konstrukten wohl.
Das Programmieren in Haskell ist jedoch wie Zauberei, und ich möchte meine Programmierkenntnisse erweitern. Ich möchte eine neue Programmiersprache zum Lernen auswählen, habe aber nicht genug Zeit, um eine beliebige Sprache zu lernen, sie fallen zu lassen und zu wiederholen. Also dachte ich, ich würde die Frage hier zusammen mit einigen Bestimmungen über die Art der Sprache, die ich suche, stellen. Einige sind subjektiv, andere sollen den Übergang von Haskell erleichtern.
- Starkes Typensystem. Einer meiner Lieblingsteile beim Programmieren in Haskell ist das Schreiben von Typdeklarationen. Dies hilft mir, meine Gedanken über einzelne Funktionen und ihre Beziehung zum gesamten Programm zu strukturieren. Es erleichtert auch das informelle Nachdenken über die Richtigkeit meines Programms. Mir geht es um Korrektheit, nicht um Effizienz.
- Schwerpunkt eher auf Rekursion als auf Iteration. Ich verwende iterative Konstrukte in Haskell, implementiere sie aber rekursiv. Es ist jedoch viel einfacher, die Struktur einer rekursiven Funktion zu verstehen als eine komplizierte iterative Prozedur, insbesondere wenn Kombinatoren und Funktionen höherer Ordnung wie Karten, Falten und Binden verwendet werden.
- Belohnung zu lernen. Haskell ist eine lohnende Sprache, in der man arbeiten kann. Es ist ein bisschen wie Kant zu lesen. Meine Erfahrung vor einigen Jahren mit C war es jedoch nicht. Ich suche nicht nach C. Die Sprache sollte ein konzeptionell interessantes Paradigma durchsetzen, was meiner Meinung nach die C-Likes meiner Meinung nach nicht tun.
Abwägen der Antworten : Dies sind natürlich nur Notizen. Ich möchte nur allen antworten, die wohlgeformte Antworten gegeben haben. Du warst sehr hilfreich.
1) Mehrere Antworten zeigten, dass eine starke, statisch typisierte Sprache, die die Rekursion betont, eine andere funktionale Sprache bedeutet. Während ich weiterhin stark mit Haskell zusammenarbeiten möchte, haben Camccann und Larsmans zu Recht darauf hingewiesen, dass eine andere solche Sprache "den Übergang zu sehr erleichtern" würde. Diese Kommentare waren sehr hilfreich, da ich Haskell nicht in Caml schreiben möchte! Von den Beweisassistenten sehen Coq und Agda beide interessant aus. Insbesondere würde Coq eine solide Einführung in die konstruktive Logik und die formale Typentheorie bieten. Ich habe ein wenig Zeit mit Prädikaten erster Ordnung und modaler Logik verbracht (Mendellsohn, Enderton, einige von Hinman), also würde ich wahrscheinlich viel Spaß mit Coq haben.
2) Andere bevorzugten Lisp (Common Lisp, Scheme und Clojure). Soweit ich weiß , verfügen sowohl Common Lisp als auch Scheme über ein hervorragendes Einführungsmaterial ( On Lisp und The Reasoned Schemer , SICP ). Das Material in SICP veranlasst mich, mich dem Schema zuzuwenden . Das Programm über SICP würde insbesondere eine andere Bewertungsstrategie, die Umsetzung von Faulheit und die Möglichkeit abdecken, sich auf Themen wie Fortsetzungen, Dolmetscher, symbolische Berechnungen usw. zu konzentrieren. Wie andere bereits betont haben, wäre Lisps Behandlung von Code / Daten völlig neu. Daher neige ich stark zu Option (2), einem Lisp.
3) Drittens Prolog. Prolog hat eine Fülle von interessantem Material, und seine primäre Domäne ist genau das, was ich in interessiert bin. Es hat eine einfache Syntax und ist leicht zu lesen. Ich kann im Moment nicht mehr kommentieren, aber nachdem ich einen Überblick über Prolog gelesen und ein Einführungsmaterial überflogen habe, rangiert es mit (2). Und es scheint, als würde Prologs Backtracking immer in Haskell gehackt!
4) Von den gängigen Sprachen sieht Python am interessantesten aus. Tim Yates lässt die Sprachen sehr ansprechend klingen. Anscheinend wird Python häufig CS-Majors im ersten Jahr beigebracht. Es ist entweder konzeptionell reichhaltig oder leicht zu erlernen. Ich müsste mehr recherchieren.
Vielen Dank für Ihre Empfehlungen! Es sieht so aus, als ob ein Lisp (Schema, Clojure), ein Prolog oder ein Proof-Assistent wie Coq oder Agda die wichtigsten Sprachen sind, die empfohlen werden.
quelle
Antworten:
Ich fürchte, Sie könnten den Übergang hier etwas zu sehr erleichtern. Das sehr strenge Typensystem und der rein funktionale Stil sind charakteristisch für Haskell, und so ziemlich alles, was einer gängigen Programmiersprache ähnelt, erfordert zumindest einen Kompromiss bei einer dieser Sprachen. In diesem Sinne finden Sie hier einige allgemeine Vorschläge, die darauf abzielen, das meiste, was Sie an Haskell zu mögen scheinen, beizubehalten, jedoch mit einigen wesentlichen Änderungen.
Ignorieren Sie die Praktikabilität und entscheiden Sie sich für "mehr Haskell als Haskell" : Das Haskell-Typensystem ist aufgrund von Nichtbeendigung und anderen unordentlichen Kompromissen voller Löcher. Räumen Sie das Chaos auf und fügen Sie leistungsfähigere Funktionen hinzu. Sie erhalten Sprachen wie Coq und Agda , in denen der Typ einer Funktion einen Beweis für ihre Richtigkeit enthält (Sie können sogar den Funktionspfeil
->
als logische Implikation lesen !). Diese Sprachen wurden für mathematische Beweise und für Programme mit extrem hohen Korrektheitsanforderungen verwendet. Coq ist wahrscheinlich die bekannteste Sprache des Stils, aber Agda hat ein eher Haskell-artiges Gefühl (und ist auch in Haskell selbst geschrieben).Ignorieren Sie Typen, fügen Sie mehr Magie hinzu : Wenn Haskell Zauberei ist, ist Lisp die rohe, ursprüngliche Magie der Schöpfung. Lisp-Familiensprachen (einschließlich Scheme und Clojure ) weisen eine nahezu beispiellose Flexibilität in Kombination mit extremem Minimalismus auf. Die Sprachen haben im Wesentlichen keine Syntax und schreiben Code direkt in Form einer Baumdatenstruktur. Die Metaprogrammierung in einem Lisp ist in einigen Sprachen einfacher als die Nicht-Meta-Programmierung.
Machen Sie ein bisschen Kompromisse und nähern Sie sich dem Mainstream : Haskell fällt in die breite Familie von Sprachen, die stark von ML beeinflusst sind und zu denen Sie wahrscheinlich ohne allzu große Schwierigkeiten wechseln könnten . Haskell ist eine der strengsten, wenn es um Korrektheitsgarantien in Bezug auf Typen und Verwendung des funktionalen Stils geht, wobei andere häufig entweder hybride Stile sind und / oder aus verschiedenen Gründen pragmatische Kompromisse eingehen. Wenn Sie sich mit OOP vertraut machen und auf viele gängige Technologieplattformen zugreifen möchten, wählen Sie entweder Scala auf der JVM oder F #on .NET haben viel mit Haskell gemeinsam und bieten gleichzeitig eine einfache Interoperabilität mit den Plattformen Java und .NET. F # wird direkt von Microsoft unterstützt, weist jedoch im Vergleich zu Haskell und Portabilitätsproblemen auf Nicht-Windows-Plattformen einige lästige Einschränkungen auf. Scala hat direkte Gegenstücke zu mehr von Haskells Typsystem und Javas plattformübergreifendem Potenzial, hat jedoch eine schwerere Syntax und es fehlt die leistungsstarke Erstanbieter-Unterstützung, die F # genießt.
Die meisten dieser Empfehlungen werden auch in anderen Antworten erwähnt, aber hoffentlich bietet meine Begründung für sie eine gewisse Aufklärung.
quelle
Ich werde dieser Typ sein und vorschlagen, dass Sie nach dem Falschen fragen.
Zuerst sagen Sie, dass Sie Ihren Horizont erweitern möchten. Dann beschreiben Sie die Art von Sprache, die Sie wollen, und ihre Horizonte klingen unglaublich wie die Horizonte, die Sie bereits haben. Sie werden nicht viel gewinnen, wenn Sie immer wieder dasselbe lernen.
Ich würde vorschlagen, dass Sie ein Lisp lernen - dh Common Lisp, Scheme / Racket oder Clojure. Sie werden standardmäßig alle dynamisch eingegeben, verfügen jedoch über eine Art Tipphinweis oder eine optionale statische Eingabe. Schläger und Clojure sind wahrscheinlich Ihre besten Wetten.
Clojure ist jünger und hat standardmäßig mehr Haskellismen wie Unveränderlichkeit und viele verzögerte Bewertungen. Es basiert jedoch auf der Java Virtual Machine, was bedeutet, dass es einige seltsame Warzen aufweist (z. B. unterstützt die JVM die Eliminierung von Tail Calls nicht, daher ist Rekursion eine Art Rekursion eines Hacks).
Racket ist viel älter, hat aber auf dem Weg viel Kraft gewonnen, wie z. B. statische Typunterstützung und ein Fokus auf funktionale Programmierung. Ich denke, Sie würden wahrscheinlich das Beste aus Racket herausholen.
Die Makrosysteme in Lisps sind sehr interessant und weitaus leistungsfähiger als alles, was Sie sonst noch sehen werden. Das allein ist zumindest einen Blick wert.
quelle
Unter dem Gesichtspunkt, was zu Ihrem Hauptfach passt, scheint die offensichtliche Wahl eine logische Sprache wie Prolog oder seine Ableitungen zu sein. Die Logikprogrammierung kann sehr ordentlich in einer funktionalen Sprache durchgeführt werden (siehe z. B. The Reasoned Schemer ), aber es könnte Ihnen Spaß machen, direkt mit dem Logikparadigma zu arbeiten.
Ein interaktives Theorembeweisungssystem wie twelf oder coq könnte Ihnen ebenfalls auffallen.
quelle
Ich würde Ihnen raten, Coq zu lernen , einen leistungsstarken Proof-Assistenten mit Syntax, der sich für den Haskell-Programmierer angenehm anfühlt. Das Coole an Coq ist, dass es in andere funktionale Sprachen, einschließlich Haskell, extrahiert werden kann. Es gibt sogar ein Paket ( Meldable-Heap ) auf Hackage, das in Coq geschrieben wurde, dessen Eigenschaften über seine Funktionsweise bewiesen und dann nach Haskell extrahiert wurden.
Eine andere beliebte Sprache, die mehr Macht bietet als Haskell, ist Agda - ich kenne Agda nicht, außer zu wissen, dass sie abhängig von Hackage geschrieben und von Menschen, die ich respektiere, gut respektiert wird, aber das sind gute Gründe für mich.
Ich würde nicht erwarten, dass beides einfach ist. Wenn Sie jedoch Haskell kennen und zu einer Sprache übergehen möchten, die mehr Leistung bietet als das Haskell-Typsystem, sollten Sie diese berücksichtigen.
quelle
Da Sie neben Ihren subjektiven Interessen keine Einschränkungen erwähnt und "Belohnung für das Lernen" hervorgehoben haben (nun, ok, ich werde die Einschränkung der statischen Typisierung ignorieren), würde ich vorschlagen, einige Sprachen mit unterschiedlichen Paradigmen zu lernen, und vorzugsweise solche, die sind für jeden von ihnen "vorbildlich".
Besonders Lisps (CL nicht so sehr wie Scheme) und Prolog (und Haskell) begrüßen die Rekursion.
Obwohl ich in keiner dieser Sprachen ein Guru bin, habe ich einige Zeit mit jeder von ihnen verbracht, außer mit Erlang und Forth, und alle gaben mir augenöffnende und interessante Lernerfahrungen, da sich jede Problemlösung aus einem anderen Blickwinkel nähert .
Obwohl es so aussieht, als hätte ich den Teil ignoriert, dass Sie keine Zeit haben, ein paar Sprachen auszuprobieren, denke ich eher, dass die Zeit, die Sie mit einer dieser Sprachen verbringen, nicht verschwendet wird, und Sie sollten sich alle ansehen.
quelle
Wie wäre es mit einer stapelorientierten Programmiersprache ? Katze trifft Ihre Höhepunkte. Es ist:
Dr. Dobbs veröffentlichte 2008 einen kurzen Artikel über Cat, obwohl sich die Sprache leicht geändert hat.
quelle
Wenn Sie einen stark (er) typisierten Prolog wollen, ist Merkur eine interessante Wahl. Ich habe mich in der Vergangenheit damit beschäftigt und ich mochte die andere Perspektive, die es mir gab. Es hat auch Modifikationen (welche Parameter müssen frei / fest sein) und Determinismus (wie viele Ergebnisse gibt es?) Im Typsystem.
Clean ist Haskell sehr ähnlich, verfügt jedoch über eine eindeutige Typisierung, die als Alternative zu Monaden (genauer gesagt der IO-Monade) verwendet wird. Die Eingabe von Eindeutigkeiten macht auch interessante Dinge für die Arbeit mit Arrays.
quelle
Ich bin etwas spät dran, aber ich sehe, dass niemand einige Paradigmen und verwandte Sprachen erwähnt hat, die Sie für ihr hohes Maß an Abstraktion und Allgemeinheit interessieren können:
quelle
Obwohl es eines Ihrer großen Kriterien nicht erfüllt (statische * Eingabe), werde ich mich für Python aussprechen. Hier sind einige Gründe, warum Sie es sich ansehen sollten:
Ich verstehe, wenn Sie nach etwas anderem suchen. Zum Beispiel könnte die Logikprogrammierung genau das Richtige für Sie sein, wie andere vorgeschlagen haben.
* Ich nehme an, Sie meinen hier statische Typisierung, da Sie die Typen deklarieren möchten. Techincally, Python ist eine stark typisierte Sprache, da man nicht beliebig interpretieren kann, sagen, eine Zeichenfolge als Zahl. Interessanterweise gibt es Python-Derivate, die statische Typisierung ermöglichen, wie Boo .
quelle
map
,filter
etc. Aber immer noch, Generatoren und Generator Ausdrücke werden vertraut mit jemandem fühlen , die faul Auswertung und die genannten Funktionen kennt.Ich würde dir Erlang empfehlen. Es ist keine stark typisierte Sprache und Sie sollten es versuchen. Es ist ein ganz anderer Programmieransatz, und Sie können feststellen, dass es Probleme gibt, bei denen starkes Tippen nicht das beste Werkzeug (TM) ist. Auf jeden Fall bietet Erlang Ihnen Tools zur statischen Typüberprüfung (Typer, Dialysator), und Sie können Teile, bei denen Sie davon profitieren, stark tippen. Es kann eine interessante Erfahrung für Sie sein, aber seien Sie vorbereitet, es wird ein ganz anderes Gefühl sein. Wenn Sie nach einem "konzeptionell interessanten Paradigma" suchen, finden Sie diese in Erlang, Nachrichtenübermittlung, Speichertrennung statt Freigabe, Verteilung, OTP, Fehlerbehandlung und Fehlerausbreitung anstelle von Fehler "Verhinderung" und so weiter. Erlang kann weit von Ihrer aktuellen Erfahrung entfernt sein, aber immer noch Gehirnkitzeln, wenn Sie Erfahrung mit C und Haskell haben.
quelle
Angesichts Ihrer Beschreibung würde ich Ocaml oder F # vorschlagen .
Die ML-Familie ist im Allgemeinen sehr gut in Bezug auf ein starkes Typsystem. Die Betonung der Rekursion in Verbindung mit dem Mustervergleich ist ebenfalls klar.
Wo ich ein bisschen zögere, ist es lohnend, einen Teil zu lernen . Sie zu lernen war zweifellos eine Belohnung für mich. Aber angesichts Ihrer Einschränkungen und Ihrer Beschreibung dessen, was Sie wollen, scheinen Sie nicht wirklich nach etwas viel anderem zu suchen als nach Haskell.
Wenn Sie Ihre Einschränkungen nicht festgelegt hätten, hätte ich Python oder Erlang vorgeschlagen , die Sie beide aus Ihrer Komfortzone bringen würden.
quelle
Nach meiner Erfahrung bedeutet starkes Tippen + Betonung der Rekursion eine weitere funktionale Programmiersprache. Andererseits frage ich mich, ob das sehr lohnend ist, da keiner von ihnen so "rein" sein wird wie Haskell.
Wie andere Poster vorgeschlagen haben, sind Prolog und Lisp / Scheme nett, obwohl beide dynamisch typisiert sind. Insbesondere über Scheme wurden viele großartige Bücher mit einem starken theoretischen "Geschmack" veröffentlicht. Werfen Sie einen Blick auf SICP , das auch eine Menge allgemeiner Informatikkenntnisse vermittelt (meta-zirkuläre Dolmetscher und dergleichen).
quelle
Faktor wird eine gute Wahl sein.
quelle
Sie könnten anfangen, sich mit Lisp zu befassen .
Prolog ist auch eine coole Sprache.
quelle
Wenn Sie sich entscheiden, von Ihrer Präferenz für ein Typsystem abzuweichen, könnte Sie die Programmiersprache J interessieren. Es ist hervorragend dafür, wie es die Funktionszusammensetzung betont. Wenn Sie in Haskell einen punktfreien Stil mögen, wird sich die stillschweigende Form von J lohnen. Ich fand es außerordentlich zum Nachdenken anregend, insbesondere in Bezug auf die Semantik.
Es stimmt, es passt nicht zu Ihren Vorurteilen darüber, was Sie möchten, aber sehen Sie es sich an. Nur zu wissen, dass es da draußen ist, ist eine Entdeckung wert. Die einzige Quelle für vollständige Implementierungen ist J Software, jsoftware.com.
quelle
Gehen Sie mit einem der Hauptströme. Angesichts der verfügbaren Ressourcen, der zukünftigen Marktfähigkeit Ihrer Fähigkeiten und des reichhaltigen Entwickler-Ökosystems sollten Sie entweder mit Java oder C # beginnen .
quelle
Gute Frage - ich habe es mir kürzlich selbst gestellt, nachdem ich einige Monate lang Haskell ausgiebig genossen hatte, obwohl mein Hintergrund sehr unterschiedlich ist (organische Chemie).
Wie Sie kommen C und sein Typ nicht in Frage.
Ich habe heute zwischen Python und Ruby als den beiden praktischen Skriptsprachen für Arbeitspferde (Maultiere?) Oszilliert, die beide einige funktionale Komponenten enthalten, um mich glücklich zu machen. Ohne hier irgendwelche Rubyist / Pythonist-Debatten zu beginnen, lautet meine persönliche pragmatische Antwort auf diese Frage:
Lernen Sie die (Python oder Ruby), für die Sie sich zuerst entschuldigen müssen.
quelle