Welche Sprache soll man nach Haskell lernen? [geschlossen]

85

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.

Danportin
quelle
34
2,5 Monate sind nicht genug Zeit, um eine Sprache gründlich zu lernen. Tut mir leid, dass Sie Ihre Blase platzen lassen.
Woot4Moo
20
Das stimmt sicherlich. Ich wollte nicht implizieren, dass ich Haskell "gelernt" hatte, was auch immer das bedeutet. Ich meinte, dass ich mich mit der Sprache wohl fühle. Ich werde eindeutig nicht "aufhören zu lernen".
Danportin
10
@ Michael: Codierung für Korrektheit statt Effizienz ist etwas, von dem ich gerne mehr sehen würde ...
Deniz Dogan
24
@ Woot4Moo: 2,5 Monate sind jedoch genug Zeit, um sich mit einer Sprache "vertraut zu machen". Doppelt so, wenn er mit formaler Logik vertraut ist und mit abstrakten Konzepten aus seinem philosophischen Hintergrund arbeitet. In diesem Fall würde es auch helfen, Gewohnheiten aus anderen Sprachen nicht verlernen zu müssen.
CA McCann
8
@gnovice: Es wurde sicherlich oft gefragt. Aber dies ist das erste Mal, dass ich auf jemanden stoße, der seine ersten ernsthaften Programmiererfahrungen mit Haskell gemacht hat. Es ist, als wäre der Pfeil der Zeit umgekehrt worden oder so.
Muhammad Alkarouri

Antworten:

85

Ich möchte meine Programmierkenntnisse erweitern. (...) Ich dachte, ich würde die Frage hier stellen, zusammen mit einigen Bestimmungen über die Art der Sprache, die ich suche. Einige sind subjektiv, andere sollen den Übergang von Haskell erleichtern.

Starkes Typensystem. (...) 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 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.

CA McCann
quelle
4
Ich Familie von Coq und Agda können Sie auch Qi II anschauen .
Hynek-Pichi-Vychodil
Was wären Ihrer Meinung nach die nervigen Einschränkungen von F #? Als jemand, der in seiner Freizeit F # lernt, bin ich neugierig zu wissen.
Lucas
7
@Lucas: Das große gegen nackte Knochen Haskell ist das Fehlen von höherwertigem Polymorphismus und Typklassen. Darüber hinaus sind einige GHC-spezifische Erweiterungen ziemlich nett. Nichts davon ist ein fataler Fehler, aber nachdem man sich an Haskell gewöhnt hat, fühlt es sich einfach irgendwie ungeschickt an, dieses Zeug nicht zu haben. Stellen Sie sich vor, Sie wechseln von modernem C # zurück zu C # 1.x ...
CA McCann
@HyneK: Diese Qi 2-Sprache scheint auf den ersten Blick sehr interessant und flexibler zu sein als Coq oder Adga. Es scheint, als hätte der Autor beschlossen, es als beendet zu bezeichnen. Gibt es eine Bewegung, um weiter an dieser Sprache zu arbeiten? Ich würde nicht etwas lernen wollen, das schon halb tot ist.
Alex
@ Alex: sieht so aus, als würde es als Shen fortgesetzt: shenlanguage.org
amindfv
20

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.

Futter
quelle
3
Aus Haskell-Sicht sehen Tipphinweise oder optionale statische Eingaben nicht wirklich anders aus als vollständig dynamische Eingaben. Es ist eine ganz andere Denkweise. Trotzdem machen Lisp-y-Sprachen jede Menge Spaß und sind etwas, von dem ich denke, dass jeder Programmierer mindestens einige Zeit mit Lernen verbringen sollte.
CA McCann
19

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.

sclv
quelle
2
Wenn Sie Interesse an einer stark typisierten Sprache bekunden, würde ich lambdaProlog empfehlen, eine typisierte Logikprogrammiersprache höherer Ordnung. Eine kompilierte Implementierung ist Teyjus - code.google.com/p/teyjus (Offenlegung: Ich habe an Teyjus gearbeitet).
Zach Snow
18

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.

Thomas M. DuBuisson
quelle
1
Agda klingt wie der natürliche "nächste Schritt" von Haskell.
Deniz Dogan
5
Es ist auch erwähnenswert, dass, wenn er als Philosophiestudent viel Erfahrung mit formaler Logik hat, Beweisassistenten im Curry-Howard-Stil für ihn möglicherweise weniger verwirrend sind als für die meisten erfahrenen Programmierer!
CA McCann
11

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".

  • Ein Lisp- Dialekt für die Sache Code-as-Data / Homoiconicity und weil sie gute, wenn nicht die besten Beispiele für dynamische (mehr oder weniger strenge) funktionale Programmiersprachen sind
  • Prolog als vorherrschende logische Programmiersprache
  • Smalltalk als die einzig wahre OOP-Sprache (auch interessant wegen seines normalerweise extrem bildzentrierten Ansatzes)
  • Vielleicht Erlang oder Clojure, wenn Sie an Sprachen interessiert sind, die für die gleichzeitige / parallele / verteilte Programmierung entwickelt wurden
  • Weiter für die stapelorientierte Programmierung
  • ( Haskell für streng funktionale statisch typisierte Lazy-Programmierung)

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.

danlei
quelle
Ich konnte
Erlangs
10

Wie wäre es mit einer stapelorientierten Programmiersprache ? Katze trifft Ihre Höhepunkte. Es ist:

  • Statisch mit Typinferenz typisiert.
  • Lässt Sie gängige Konzepte für imperative Sprachen wie Schleifen überdenken. Bedingte Ausführung und Schleifen werden mit Kombinatoren behandelt .
  • Belohnung - zwingt Sie, ein weiteres Rechenmodell zu verstehen. Gibt Ihnen eine andere Möglichkeit, über Probleme nachzudenken und sie zu zerlegen.

Dr. Dobbs veröffentlichte 2008 einen kurzen Artikel über Cat, obwohl sich die Sprache leicht geändert hat.

Corbin März
quelle
10

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.

yatima2975
quelle
8

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:

  • Für eine imperative Sprache ist es überraschend funktional. Dies war eines der Dinge, die mir aufgefallen sind, als ich es gelernt habe. Nehmen wir zum Beispiel das Listenverständnis . Es hat Lambdas, erstklassige Funktionen und viele funktional inspirierte Kompositionen auf Iteratoren (Karten, Falten, Reißverschlüsse ...). Sie haben die Möglichkeit, das für das Problem am besten geeignete Paradigma auszuwählen.
  • IMHO ist es, wie Haskell, schön zu codieren. Die Syntax ist einfach und elegant.
  • Es hat eine Kultur, die sich darauf konzentriert, Dinge auf einfache Weise zu erledigen, anstatt sich zu sehr auf Effizienz zu konzentrieren.

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 .

Tim Yates
quelle
Ein starkes Typensystem bedeutet jedoch nicht unbedingt nur "statische" Typisierung.
Deniz Dogan
+1 siehe auch meinen Kommentar zur Antwort von larsmans. Achten Sie jedoch darauf, Python als eher funktional zu bewerben. Zum Beispiel werden Generator Ausdrücke in der Regel bevorzugt über map, filteretc. Aber immer noch, Generatoren und Generator Ausdrücke werden vertraut mit jemandem fühlen , die faul Auswertung und die genannten Funktionen kennt.
16
"Ja wirklich?" Ich denke, Python scheint vor allem für Leute besonders funktional zu sein, die nicht viel funktionale Programmierung gemacht haben. Ich habe sowohl Python als auch Haskell ziemlich oft verwendet, und obwohl Python eine nette Sprache ist und sicherlich ein paar Dinge aus funktionalen Sprachen entlehnt hat, ist es immer noch zu 99% unerlässlich.
CA McCann
@camccann Du hast recht - meine Perspektive ist anders, weshalb ich dies nur als interessante Alternative anbiete. Als jemand, der zuerst die imperative Programmierung gelernt hat, weiß ich zu schätzen, dass Python es mir ermöglicht, funktionale Techniken dort einzusetzen, wo sie angemessen sind, und sie dort zu vermeiden, wo etwas anderes Sinn macht. Ich mache nicht den Fall, dass es "funktionsfähig" ist - nur, dass es einen guten Kompromiss darstellt.
Tim Yates
Die von Haskell gelernten Gewohnheiten können Sie zu einem viel besseren Python-Programmierer machen als andere, die es als Muttersprache gelernt haben.
u0b34a0f6ae
8

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.

Hynek-Pichi-Vychodil
quelle
8

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.

Muhammad Alkarouri
quelle
6

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).

Fred Foo
quelle
4
+1 für den ersten Absatz, genau das, was ich dachte, als ich die Frage las. Um neue Dinge zu lernen, würde ich eine moderne imperative Sprache wie Python vorschlagen - zumal dies nicht das ist, was das OP gewohnt ist (dynamisches Tippen, Iteratoren überall usw.). Es hat auch sehr coole fortgeschrittene Konzepte wie Metaklassen oder Generatoren (die auffallend faulen Listen ähnlich sind) / Generatorausdrücke (die als Verallgemeinerung des Listenverständnisses + Generatoren dienen). Auch diktieren und Verständnisregeln festlegen.
3
@delnan: Haskell verfügt auch über Listenverständnisse, und Generatoren / Iteratoren können mithilfe des Standard-Listentyps von Haskell problemlos in Haskell ausgedrückt werden. Die größten Unterschiede zwischen den beiden Sprachen wären meiner Meinung nach die objektorientierte Programmierung und (meistens) unreine Datenstrukturen wie Wörterbücher.
Deniz Dogan
1
@ Deniz Dogan: Vergessen Sie nicht das Fehlen von Deklarationen und das richtige lexikalische Scoping in Python.
Fred Foo
5

Sie könnten anfangen, sich mit Lisp zu befassen .

Prolog ist auch eine coole Sprache.


quelle
5

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.

kaleidisch
quelle
0

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 .

Angkor Wat
quelle
14
Im Vergleich zu Haskell sind beide IMO ziemlich lahme Sprachen.
fehlender Faktor
9
Einen Haskeller zu bitten, nach Java zu ziehen, ist wie Bill Gates zu bitten, in Slums zu ziehen. : - /
fehlender Faktor
1
+1 Für den Vorschlag von etwas, das Sie definitiv abstimmen lässt. Java und C # haben schöne Ökosysteme und sind beide für ernsthafte Arbeit sehr zu empfehlen. Als definitives Plus können Sie Ihr Wissen über Haskell (, Java und C #) nutzen, wenn Sie Clojure in der JVM oder F # in der CLR verwenden.
Ponzao
6
@ponzao: Urgh, nein, es ist einfach schrecklich und grausam, wenn jemand von Haskell nach Java oder C # wechselt. Scala, F # und Clojure sind viel schönere Sprachen mit denselben Vorteilen, die sich aus der Ausführung auf der JVM / CLR ergeben.
CA McCann
5
Für eine analytische Philosophie sind Major Java oder C # Zeitverschwendung.
MaD70
0

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.

jdo
quelle