Frage

Ich werde eine Unterteilung natürlich in diskreten Strukturen zu unterrichten. Ich habe den Text Buch , Logik und Berechenbarkeit zum Teil, weil es enthält Beispiele und Konzepte, die mit einer funktionalen Programmiersprache förderlich für die Umsetzung sind. (Ich denke auch, es ist ein gutes Lehrbuch.)

Ich möchte eine einfach zu verstehende FP Sprache DS Konzepte zu veranschaulichen und dass die Schüler nutzen können. Die meisten Studenten haben nur ein oder zwei Semester der Programmierung in Java, bestenfalls hatte. Nach einem Blick auf Schema, Erlang, Haskell, Ocaml und SML, ich habe entweder Haskell oder Standard ML abgewickelt. Ich bin Neigung in Richtung Haskell aus den Gründen, unten beschrieben, aber ich würde die Meinung wie jene, die aktiven Programmierer in der einen oder andere sind.

  • Sowohl Haskell und SML haben Pattern-Matching, die einen rekursiven Algorithmus ein Kinderspiel macht beschreibt.
  • hat Haskell schöne Liste Comprehensions, die gut mit der Art und Weise solche Listen entsprechen mathematisch ausgedrückt werden.
  • hat Haskell lazy evaluation. Groß für unendliche Listen Konstruktion der Liste Verständnis Technik.
  • hat SML einen wirklich interaktiven Interpreter, in der Funktion kann sowohl definiert und verwendet werden. In Haskell, Funktionen in einer separaten Datei definiert werden müssen und kompiliert, bevor sie in der interaktiven Shell verwendet werden.
  • gibt SML explizite Bestätigung des Funktionsarguments und Rückgabetypen in einer Syntax, die leicht zu verstehen ist. Zum Beispiel: val foo = fn: int * int -> int. Haskell implizite Curry Syntax ist etwas stumpf, aber nicht völlig fremd. Zum Beispiel: foo :: Int -> Int -> Int
  • .
  • Haskell verwendet beliebiger Genauigkeit Integer standardmäßig. Es ist eine externe Bibliothek in SML / NJ. Und SML / NJ kürzt Ausgabe 70 Zeichen standardmäßig aktiviert.
  • Haskells Lambda-Syntax ist subtil - es verwendet einen einzelnen Backslash. SML ist expliziter. Nicht sicher, ob wir jemals in dieser Klasse müssen Lambda werden, though.

Im Wesentlichen SML und Haskell sind in etwa gleichwertig. Ich lehne mich in Richtung Haskell, weil ich die Liste Comprehensions und unendliche Listen in Haskell bin zu lieben. Aber ich mache mir Sorgen, dass die umfangreiche Anzahl von Symbolen in Haskell kompakter Syntax könnte Studenten zu Problemen führen. Von dem, was ich anderen Beiträge auf SO Lesen gesammelt haben, ist Haskell nicht für Anfänger anfangen mit FP empfohlen. Aber wir werden nicht vollwertige Anwendungen zu bauen, nur einfache Algorithmen ausprobieren.

Was denken Sie?


Edit:. Bei einigen Ihrer großen Antworten zu lesen, sollte ich einige meiner Aufzählungspunkte klären

In SML, gibt es keine syntaktische Unterscheidung eine Funktion in dem Dolmetscher zwischen Definition und es in einer externen Datei definieren. Angenommen, Sie haben die Fakultäts-Funktion schreiben wollen. In Haskell Sie diese Definition in einer Datei speichern, und laden Sie es in GHCi:

fac 0 = 1
fac n = n * fac (n-1)

Für mich, das ist klar, prägnant und stimmt mit der mathematischen Definition in dem Buch. Aber wenn Sie die Funktion in GHCi direkt schreiben möchten, müssen Sie eine andere Syntax verwenden:

let fac 0 = 1; fac n = n * fac (n-1)

Wenn Sie mit interaktiven Dolmetschern arbeiten, von einer Lehre Perspektive es sehr ist, sehr praktisch, wenn der Schüler beide den gleichen Code in einer Datei verwenden kann, und die Befehlszeile.

Mit dem „ausdrücklichen Bestätigung der Funktion“ Ich meinte, dass die Funktion bei der Definition SML sofort sagt Ihnen den Namen der Funktion, die Typen der Argumente und der Rückgabetyp. In Haskell haben Sie den :type Befehl verwenden, und Sie etwas verwirrend Curry Notation dann erhalten.

Eine weitere coole Sache, über Haskell - das ist eine gültige Funktionsdefinition:

fac 0 = 1
fac (n+1) = (n+1) * fac n

Auch dies entspricht eine Definition sie im Lehrbuch finden könnte. Kann nicht, dass in SML tun!

War es hilfreich?

Lösung

So sehr ich Haskell lieben, hier sind die Gründe, warum ich würde in diskreten Mathematik und Datenstrukturen für eine Klasse SML bevorzugen (und die meisten anderen Anfängerklassen):

  • Zeit- und Raumkosten von Haskell-Programme können sehr hart sein, um vorherzusagen, auch für Experten. SML bietet viel mehr begrenzte Möglichkeiten, um die Maschine zu blasen.

  • Syntax für die Funktion Defintion in einem interaktiven Interpreter ist identisch in einer Datei verwendet, um Syntax, so können Sie ausschneiden und einfügen.

  • Obwohl in SML Betreiber Überlastung völlig falsche ist, es ist auch einfach. Es wird eine ganze Klasse in Haskell zu hart sein, ohne in Typklassen zu erhalten, die zu lehren.

  • Student kann mit print debuggen. (Obwohl, wie ein Kommentator weist darauf hin, es ist möglich, bei Debug.Trace.trace fast die gleiche Wirkung in Haskell zu erhalten.)

  • Infinite Datenstrukturen der Köpfe der Menschen zu blasen. sie definieren einen Stream-Typ komplett mit ref Zellen und Thunks für Anfänger, sind Sie besser dran ist, damit sie wissen, wie es funktioniert:

    datatype 'a thunk_contents = UNEVALUATED of unit -> 'a
                               | VALUE of 'a
    type 'a thunk = 'a thunk_contents ref
    val delay : (unit -> 'a) -> 'a thunk
    val force : 'a thunk -> 'a
    

    Jetzt ist es keine Magie mehr, und Sie können von hier aus zu Strömen (unendliche Listen) gehen.

  • Layout nicht so einfach wie in Python und kann verwirrend sein.

Es gibt zwei Orte Haskell hat eine Kante:

  • Im Kern Haskell Sie eine Funktion des Typs Unterschrift schreiben können kurz vor seiner Definition. Dies ist äußerst hilfreich für Studenten und andere Anfänger. Es gibt einfach keine schöne Art und Weise mit Typ-Signaturen in SML zu befassen.

  • Haskell hat eine bessere konkrete Syntax. Die Haskell-Syntax ist eine wesentliche Verbesserung gegenüber ML-Syntax. Ich habe ein kurze Notiz geschrieben, wenn Klammern in einem ML verwenden Programm ; das hilft ein wenig.

Schließlich gibt es ein Schwert, das in beiden Richtungen schneidet:

  • Haskell-Code ist rein standardmäßig, so dass Ihre Schüler sind unwahrscheinlich unreine Konstrukte (IO Monade, Zustand Monade) zufällig stolpern. Aber aus dem gleichen Grund, sie nicht drucken können, und wenn Sie wollen, I / O dann bei minumum haben Sie do Notation zu erklären und return ist verwirrend.

Auf einem verwandten Thema, hier einige Tipps für Ihre Kursvorbereitung: nicht übersehen rein funktionale Datenstrukturen von Chris Okasaki. Auch wenn Sie Ihre Schüler es verwenden, nicht haben, werden Sie auf jeden Fall eine Kopie haben wollen.

Andere Tipps

Wir lehren Haskell ersten Jahren an unserer Universität. Meine Gefühle über diese sind etwas gemischt. Auf der einen Seite Haskell ersten Jahren Unterricht bedeutet, sie müssen nicht zwingend notwendig, Stil verlernen. Haskell kann auch sehr prägnant Code produzieren, die Menschen, die vor schätzen kann einige Java hatte.

Einige Probleme, die ich bemerkt habe Studenten haben oft:

  • Die Mustererkennung kann zunächst ein bisschen schwierig, sein. Die Schüler hatten zunächst einige Probleme zu sehen, wie Wert Konstruktion und Pattern-Matching verwandt sind. Sie hatten auch einige Probleme zwischen Abstraktionen zu unterscheiden. Unsere Übungen enthielten Schreiben von Funktionen, die arithmetischen Ausdruck zu vereinfachen und einige Schüler hatten Schwierigkeiten, den Unterschied zwischen der abstrakten Darstellung zu sehen (zum Beispiel Const 1) und die Metasprache Darstellung (1).

    Außerdem, wenn Ihre Schüler sollen sich Liste Verarbeitungsfunktionen schreiben, vorsichtig sein, den Unterschied zwischen den Mustern Hinweis auf

    []
    [x]
    (x:xs)
    [x:xs]
    

    Je nachdem, wie viel der funktionalen Programmierung wollen, um sie auf dem Weg zu lehren, kann man ihnen nur ein paar Bibliotheksfunktionen geben und lassen Sie sie mit, dass rumspielen.

  • Wir haben nicht unsere Schüler über anonyme Funktionen lehren, wir sagten ihnen einfach über where Klauseln. Für einige Aufgaben war dies ein bisschen ausführlicher, aber gut funktioniert anders. Wir haben auch sie nicht über Teilanwendungen sagen; dies ist wahrscheinlich ganz einfach in Haskell (aufgrund seiner Form des Schreibens Typen) zu erklären, so könnte es sich lohnen, um ihnen zu zeigen sein.

  • Sie schnell Listenkomprehensionen entdeckt und bevorzugt sie über Funktionen höherer Ordnung wie filter, map, zipWith.

  • Ich denke, wir verpassten sie ein wenig heraus zu lehren, wie sie ihre Gedanken durch die Typen führen zu lassen. Ich bin mir nicht ganz sicher, aber, ob es sich um Anfänger hilfreich ist oder nicht.

  • Fehlermeldungen sind in der Regel nicht sehr hilfreich für Anfänger, könnten sie gelegentlich etwas Hilfe bei der diesen. Ich habe es nicht versucht, mich, aber es gibt ein Haskell Compiler speziell an Einsteiger gezielt, vor allem durch bessere Fehlermeldungen: Helium

  • Für die kleinen Programme, Dinge wie möglich Raum Lecks waren kein Problem.

Insgesamt ist Haskell eine gute Unterrichtssprache, aber es gibt ein paar Tücken. Da die Studenten viel wohler mit Listenkomprehensionen als Funktionen höherer Ordnung fühlen, könnte dies das Argument sein, die Sie benötigen. Ich weiß nicht, wie lange Ihr Kurs ist oder wie viel Programmierung Sie sie lehren wollen, aber machen einige Zeit lehrt sie grundlegende Konzepte planen -. Sie werden es brauchen

BTW,

  

# SML hat eine wirklich interaktive   Dolmetscher in denen Funktionen sein   beide definiert und verwendet. In Haskell,   Funktionen müssen in a definiert werden   separate Datei und erstellt vor   wobei in der interaktiven Shell verwendet.

Ist ungenau. Verwendung GHCi:

Prelude> let f x = x ^ 2
Prelude> f 7
49
Prelude> f 2
4

Es gibt auch gute Ressourcen für Haskell in der Ausbildung auf dem haskell.org edu. Seite, mit Erfahrungen aus verschiedenen Lehrern. http://haskell.org/haskellwiki/Haskell_in_education

Schließlich werden Sie in der Lage sein, sie mehradrige Parallelität nur zum Spaß zu unterrichten, wenn Sie Haskell verwenden: -)

Viele Universitäten lehren Haskell als erste funktionale Sprache oder sogar eine erste Programmiersprache, so dass ich glaube nicht, das ein Problem sein wird.

Nachdem ich einige der Lehre auf der einen solchen Kurs gemacht, ich bin nicht einverstanden, dass die möglichen Verwirrungen Sie sind, dass wahrscheinlich identifizieren. Die wahrscheinlichsten Quellen der frühen Verwirrung Fehler Parsen durch schlechtes Layout verursacht, und geheimnisvolle Nachrichten über Typklassen, wenn Zahlenliterale falsch verwendet werden.

Ich würde auch mit jedem Vorschlag nicht einverstanden, dass Haskell nicht für Anfänger anfangen mit FP empfohlen. Es ist sicherlich der große Knall Ansatz in einer Weise, die strengen Sprachen mit Mutation nicht, aber ich denke, das ist ein sehr brauchbares Konzept.

  
      
  • hat SML einen wirklich interaktiven Interpreter, in der Funktion kann sowohl definiert und verwendet werden. In Haskell, Funktionen in einer separaten Datei definiert werden müssen und kompiliert, bevor sie in der interaktiven Shell verwendet werden.
  •   

Während Umarmungen können diese Einschränkung haben, GHCi nicht:

$ ghci
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> let hello name = "Hello, " ++ name
Prelude> hello "Barry"
"Hello, Barry"

Es gibt viele Gründe, das ich GHC bevorzugen (i) über Hugs, das ist nur einer von ihnen.

  
      
  • gibt SML explizite Bestätigung des Funktionsarguments und Rückgabetypen in einer Syntax, die leicht zu verstehen ist. Zum Beispiel: val foo = fn: int * int -> int. Haskell implizite Curry Syntax ist etwas stumpf, aber nicht völlig fremd. Zum Beispiel: foo :: Int -> Int -> Int
  • .   

SML hat, was Sie "impliziten Curry" Syntax als auch nennen.

$ sml
Standard ML of New Jersey v110.69 [built: Fri Mar 13 16:02:47 2009]
- fun add x y = x + y;
val add = fn : int -> int -> int
  

Im Wesentlichen SML und Haskell sind in etwa gleichwertig. Ich lehne mich in Richtung Haskell, weil ich die Liste Comprehensions und unendliche Listen in Haskell bin zu lieben. Aber ich mache mir Sorgen, dass die umfangreiche Anzahl von Symbolen in Haskell kompakter Syntax könnte Studenten zu Problemen führen. Von dem, was ich anderen Beiträge auf SO Lesen gesammelt haben, ist Haskell nicht für Anfänger anfangen mit FP empfohlen. Aber wir werden nicht vollwertige Anwendungen zu bauen, nur einfache Algorithmen ausprobieren.

Ich mag mit Haskell viel mehr als SML, aber ich würde SML noch lehrt zuerst.

  • Entsendemitgliedstaaten nominolo Gedanken, Listenkomprehensionen tun scheinen Studenten langsam von einigen Funktionen höherer Ordnung zu bekommen.
  • Wenn Sie Faulheit und unendliche Listen wollen, ist es lehrreich es explizit zu implementieren.
  • Da SML wird mit Spannung ausgewertet, das Ausführungsmodell ist viel einfacher zu verstehen, und „Debugging über printf“ funktioniert viel besser als in Haskell.
  • SML-Typ-System ist auch einfacher. Während Ihre Klasse sie wahrscheinlich sowieso nicht verwenden würde, ist Haskells typeclasses noch eine zusätzliche Beule verwinden - bekommen sie die 'a gegen ''a Unterschied zu verstehen, in SML hart genug ist,
  • .

Die meisten Antworten waren technisch, aber ich denke, Sie sollten mindestens eine berücksichtigen, die nicht ist: Haskell (als OCaml), zu dieser Zeit, hat eine größere Gemeinschaft, die es in einem breiteren Spektrum von Kontexten. Es gibt auch eine große Datenbank von Bibliotheken und die schriftlichen Anträgen auf Profit und Spaß an Hackage . Das kann zu halten einige Ihrer Schüler mit der Sprache ein wichtiger Faktor sein, nach dem Kurs ist abgeschlossen, und vielleicht versuchen, andere funktionale Sprachen (wie Standard ML) später.

Ich bin erstaunt nicht OCaml und F # gegeben bedenkt, dass sie so viele Ihrer Bedenken auszuräumen. Sicherlich anständig und hilfreiche Entwicklungsumgebungen sind eine hohe Priorität für die Lernenden? SML ist weit hinter und F # ist weit vor allen anderen FPLS in dieser Hinsicht.

Auch beide OCaml und F # haben Listenkomprehensionen.

Haskell. Ich bin vor meiner algos / Theorie Klasse in CS wegen der Sachen, die ich verwendet, Haskell gelernt. Es ist so eine umfassende Sprache, und es wird dich lehren, eine Tonne von CS, nur, indem sie es mit .

Allerdings SML ist viel einfacher zu erlernen. Haskell verfügt über Funktionen wie faul Auswerte- und Steuerstrukturen, die es viel mächtiger, aber mit den Kosten einer steilen (ish) Lernkurve machen. SML hat keine solche Kurve.

Wie gesagt, die meisten von Haskell wurde Material von weniger wissenschaftlich / mathematischen Sprachen wie Ruby, ObjC oder Python verlernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top