Ich werde einen Kurs der unteren Abteilung in diskreten Strukturen unterrichten. Ich habe das Lehrbuch Diskrete Strukturen, Logik und Berechenbarkeit teilweise ausgewählt, weil es Beispiele und Konzepte enthält, die der Implementierung mit einer funktionalen Programmiersprache förderlich sind. (Ich denke auch, dass es ein gutes Lehrbuch ist.)
Ich möchte eine leicht verständliche FP-Sprache, um DS-Konzepte zu veranschaulichen und die die Schüler verwenden können. Die meisten Studenten hatten bestenfalls ein oder zwei Semester Programmierzeit in Java. Nachdem ich mir Scheme, Erlang, Haskell, Ocaml und SML angesehen habe, habe ich mich entweder für Haskell oder Standard ML entschieden. Ich neige mich aus den unten genannten Gründen zu Haskell, aber ich würde gerne die Meinung derer hören, die in dem einen oder anderen Programmierer aktiv sind.
- Sowohl Haskell als auch SML verfügen über einen Mustervergleich, der die Beschreibung eines rekursiven Algorithmus zum Kinderspiel macht.
- Haskell hat ein gutes Listenverständnis, das gut zu der Art und Weise passt, wie solche Listen mathematisch ausgedrückt werden.
- Haskell hat eine faule Bewertung. Hervorragend geeignet zum Erstellen von unendlichen Listen mithilfe der Listenverständnis-Technik.
- SML verfügt über einen wirklich interaktiven Interpreter, in dem Funktionen sowohl definiert als auch verwendet werden können. In Haskell müssen Funktionen in einer separaten Datei definiert und kompiliert werden, bevor sie in der interaktiven Shell verwendet werden.
- SML gibt eine explizite Bestätigung des Funktionsarguments und der Rückgabetypen in einer leicht verständlichen Syntax. Zum Beispiel: val foo = fn: int * int -> int. Haskells implizite Curry-Syntax ist etwas stumpfer, aber nicht völlig fremd. Zum Beispiel: foo :: Int -> Int -> Int.
- Haskell verwendet standardmäßig Ganzzahlen mit beliebiger Genauigkeit. Es ist eine externe Bibliothek in SML / NJ. Und SML / NJ schneidet die Ausgabe standardmäßig auf 70 Zeichen ab.
- Die Lambda-Syntax von Haskell ist subtil - sie verwendet einen einzelnen Backslash. SML ist expliziter. Ich bin mir nicht sicher, ob wir jemals Lambda in dieser Klasse brauchen werden.
Im Wesentlichen sind SML und Haskell ungefähr gleichwertig. Ich neige mich zu Haskell, weil ich das Listenverständnis und die unendlichen Listen in Haskell liebe. Ich mache mir jedoch Sorgen, dass die große Anzahl von Symbolen in Haskells kompakter Syntax den Schülern Probleme bereiten könnte. Nach dem, was ich beim Lesen anderer Beiträge auf SO gesammelt habe, wird Haskell nicht für Anfänger empfohlen, die mit FP beginnen. Wir werden jedoch keine vollwertigen Anwendungen erstellen, sondern nur einfache Algorithmen ausprobieren.
Was denken Sie?
Bearbeiten: Nachdem ich einige Ihrer großartigen Antworten gelesen habe, sollte ich einige meiner Stichpunkte klarstellen.
In SML gibt es keine syntaktische Unterscheidung zwischen der Definition einer Funktion im Interpreter und der Definition in einer externen Datei. Angenommen, Sie möchten die Fakultätsfunktion schreiben. In Haskell können Sie diese Definition in eine Datei einfügen und in GHCi laden:
fac 0 = 1
fac n = n * fac (n-1)
Für mich ist das klar, prägnant und entspricht der mathematischen Definition im Buch. Wenn Sie die Funktion jedoch direkt in GHCi schreiben möchten, müssen Sie eine andere Syntax verwenden:
let fac 0 = 1; fac n = n * fac (n-1)
Bei der Arbeit mit interaktiven Dolmetschern ist es aus Unterrichtssicht sehr, sehr praktisch, wenn der Schüler denselben Code sowohl in einer Datei als auch in der Befehlszeile verwenden kann.
Mit "expliziter Bestätigung der Funktion" meinte ich, dass SML Ihnen beim Definieren der Funktion sofort den Namen der Funktion, die Typen der Argumente und den Rückgabetyp mitteilt. In Haskell müssen Sie den :type
Befehl verwenden und erhalten dann die etwas verwirrende Curry-Notation.
Noch eine coole Sache über Haskell - dies ist eine gültige Funktionsdefinition:
fac 0 = 1
fac (n+1) = (n+1) * fac n
Dies entspricht wiederum einer Definition, die sie möglicherweise im Lehrbuch finden. Das geht in SML nicht!