Warum sind alle Lernprogramme zur funktionalen Programmierung so mathematisch?

20

Ich habe versucht, funktionale Programmierung zu lernen, und die meisten Tutorials, die ich gefunden habe, verwenden Mathematik als Beispiele für die komplizierteren Konstrukte (in einigen Fällen sogar die einfachen). Warum ist das? Ich würde mir vorstellen, dass etwas Leichteres verwendet werden könnte. Es macht es schwierig zu lernen.

Hintergrundinformation: Ich schreibe seit 12 Jahren Software. Ich verstehe einige der Konzepte wie Verschlüsse, Funktionen als erstklassige Bürger und Generika. Ich habe vielleicht Probleme mit Funktionen höherer Ordnung auf fortgeschrittenem Niveau, aber ich würde gerne glauben, dass ich ein grundlegendes Verständnis habe. Monaden beißen mich in den Hintern, und an diesem Punkt bin ich nicht darüber hinweggekommen (ich bin mir sicher, dass ich es irgendwann tun werde, weil ich hartnäckig bin).

Charles Lambert
quelle
nur ein wenig, ich habe die anderen 3 Sprachen nicht ausprobiert, die Sie vorgeschlagen haben
Charles Lambert
F # ist am einfachsten zu starten, wenn Sie C # kennen. Erfordert keine großen mathematischen Kenntnisse.
CND
6
Versuchen Sie SICP - es geht nicht zu viel über die High-School-Mathematik hinaus.
SK-logic
@Charles Lambert - Sieh dir OfficeSpace an und bekomme den zweiten Teil von Hiobs Kommentar.
Jetti
@ Charles Lambert: Lernen Sie eine Haskell für Great Good ist nicht zu mathy: D
Matthieu M.

Antworten:

21

Sie verwenden Mathematik, weil Functional Programming sehr gut in der Modellierung mathematischer Konstrukte und in mathematischen Konzepten, insbesondere Lambda Calculus, eingebunden ist. Da I ​​/ O in der Regel ein ziemlich schwieriges und fortgeschrittenes Fach in vielen Sprachen des Funktionsparadigmas ist, wird Mathematik über die REPLs der verschiedenen Sprachen zu einer guten Möglichkeit, die Sprache zunächst zu unterrichten.

Da die funktionale Programmierung Funktionen als erstklassige Konstrukte innerhalb der Programmiersprache behandelt, wird die Funktionsgenerierung sehr wichtig. Daher wird höhere Mathematik ziemlich wichtig, insbesondere Graphentheorie.

Imperative Sprachen sind genauso mathematisch, aber im Grunde ist es alles arithmetisch, da sie näher an der Maschine sind, die ohnehin nur addieren kann. Funktionale Sprachen mit ihrer höheren Abstraktion tendieren eher zur Mathematik. Die allgemeine Verwendung im akademischen Bereich hilft auch nicht, da sie von Menschen verwendet und unterrichtet werden, die viel Mathematik kennen und die Menschen unterrichten, von denen erwartet wird, dass sie viel Mathematik lernen. Es ist also möglich, es sozusagen "leiser" zu machen, aber angesichts dieser Faktoren ist es unwahrscheinlich.

http://learnyouahaskell.com/ - Ist wahrscheinlich eine der sanftesten Einführungen in die funktionale Programmierung. Ich habe sie zweimal überprüft und es gibt nichts anderes als grundlegende Algebra- und Graphentheorie.

Weltingenieur
quelle
learnyousomeerlang.com ist auch eine Option, wenn Sie neben Haskell noch etwas anderes möchten.
Travis
11

Es gibt zahlreiche Gründe, und sie hängen alle irgendwie zusammen:

  • Die meisten funktionalen Programmiersprachen wurden in einem akademischen Kontext entwickelt, in dem CS eng mit Mathematik verbunden ist, sodass die Personen, die sie entworfen haben, einen starken mathematischen Hintergrund haben (und in Bezug auf ihr Publikum dasselbe annehmen).
  • Funktionale Programmierung ist ein Paradigma, das sich besonders zur Lösung mathematisch schwerwiegender Probleme eignet
  • Die Theorie hinter FP, Lambda-Kalkül (im Grunde genommen eine abstrakte Theorie der Funktionen), ist ein Zweig der Mathematik, und FP-Sprachen tendieren dazu, die Konzepte und die Terminologie von Lambda-Kalkül zu verwenden

Auch ist FP nicht wirklich mathematischer als andere Paradigmen, aber die Schlüsselkonzepte (Funktionen als echte Bürger erster Klasse, Funktionen höherer Ordnung, Abschlüsse und Reinheit) erfordern eine bestimmte Denkweise. Irgendwann sollte Ihr Verstand "klicken"; Wenn Sie diese 4 Kernideen verstehen, ist der Rest wahrscheinlich genauso einfach wie jedes andere Paradigma.

tdammers
quelle
3
+1 für in der Wissenschaft entwickelt: Menschen, die funktionale Sprachen erstellen, basieren auf mathematischen Eigenschaften, so dass es leckt ...
Matthieu M.
@Matthieu M: Wenn eine Programmiersprache auf mathematischen Eigenschaften basiert, können Sie die richtige Software schreiben und die Entwicklungszeit verkürzen. Zum Beispiel verbringe ich definitiv weniger Zeit mit dem Debuggen meines Haskell-Codes als mit meinem C ++ - Code. Die Reduzierung der Entwicklungszeit (und der Kosten) ist ein großer praktischer Vorteil, der den Aufwand für das Erlernen einiger mathematischer Methoden rechtfertigen kann. Wie die Entwickler betonten, müssen einige zusätzliche Konzepte erlernt werden. Nachdem Sie jedoch einige Kernideen verstanden haben, ist FP ebenso intuitiv wie die imperative Programmierung.
Giorgio
Ich stimme auch mit tdammers überein, dass auch imperative Sprachen mit mathematischen Konzepten beschrieben werden können. Tatsächlich ist eine mathematische Beschreibung eines Imperativprogramms normalerweise viel komplexer als eine mathematische Beschreibung eines Funktionsprogramms. IMO erklärt dies, warum imperative Sprachen mit größerer Wahrscheinlichkeit Fehler enthalten: Es ist schwieriger, imperativen Code vollständig zu verstehen. Zumindest ist dies meine persönliche Erfahrung mit ein paar Jahren funktionaler Programmierung und vielen weiteren Jahren imperativer Programmierung.
Giorgio
@Giorgio: Es gibt einen Unterschied zwischen "in die Sprache" (irgendwie) und "in das Tutorial". Ich bin mir ziemlich sicher, dass Sie ein Tutorial für funktionale Programmierung schreiben können, ohne dass so viel Mathematik darin steckt. Natürlich ist es umstritten und wahrscheinlich subjektiv, ob sie besser wären oder nicht.
Matthieu M.
@MatthieuM .: Vielen Dank, dass Sie klargestellt haben, was Sie mit "Leaken" gemeint haben ("Leaken" im Tutorial): Ihr Kommentar ist für mich jetzt viel sinnvoller. Ich stimme Ihnen zu, dass ein Tutorial zu FP so wenig Mathematik wie möglich enthalten sollte. Ich hatte Ihren Kommentar irgendwie falsch interpretiert: Nachdem ich sowohl in der Industrie als auch in der Wissenschaft gearbeitet habe, bin ich ein bisschen überempfindlich gegenüber "in der Wissenschaft machen sie eine Menge Mathe, die in der realen Welt unbrauchbar ist". +1 für deinen Kommentar und die Antwort von tdammer.
Giorgio
5

Grundsätzlich ist Computerprogrammierung Mathematik. In diesem Sinne wurden funktionale Sprachen entwickelt, weshalb sich ein Großteil der Tutorials auf die Mathematik konzentriert.

Es ist nur schwer zu lernen, wenn Sie nicht daran gewöhnt sind, dass Computerprogrammierung eine mathematische Grundlage hat.

Rudolf Olah
quelle
4
Grundsätzlich ist Rechnen eine Kombination aus Logik und Arithmetik. Das ist keine Mathematik. Sie können eine Verzweigungsanweisung nicht in einer mathematischen Formel ausdrücken - sie kann also nicht auf Mathematik basieren. Die Menge der funktionalen Programmierer möchte, dass sie sich auf Mathematik stützt, damit sie Programmiersprachen entwickeln, die sich so verhalten, als gäbe es keine Verzweigungsanweisungen.
James Anderson
9
@ James Anderson, sagen Sie, dass Logik und Arithmetik keine Mathematik sind? Und ich habe Tonnen von mathematischen Formeln gesehen, die Verzweigungsanweisungen enthalten (normalerweise ausgedrückt in einem schalterartigen Formalismus).
Peter Taylor
4
Arithmetik ist eine Teilmenge der Mathematik, die sich mit einfachen Berechnungen befasst. Die Logik ist eine Obermenge der Mathematik, die die Grundlage allen rationalen Denkens bildet. Im Übrigen ist funktionale Programmierung eine sehr gute Idee, um Probleme zu lösen, die sich mathematisch ausdrücken lassen. Es ist nicht so heiß, wenn Sie versuchen, einem unlogischen Durcheinander von willkürlichen Regeln wie GAP (General Accepted Accounting Practices) zu folgen
James Anderson
6
@ ian31, wie würdest du das wort " fundamental " definieren? Sie wissen, Bauingenieurwesen basiert auch auf Physik und Mathematik, während es praktisch nur darum geht, Dinge zu bauen, die die Menschen nutzen und genießen können. Und bevor Sie überhaupt darüber nachdenken, eine Lösung für ein reales Problem zu programmieren, müssen Sie dieses Problem in einen mathematischen Formalismus übersetzen. Es wird einfach nicht anders funktionieren. Beim Programmieren dreht sich alles um Formalismen.
SK-logic
6
@ ian31, Programmiersprachen sind Formalismen. Ihr Verhalten ist genau definiert und vorhersehbar. Das Codieren eines bestimmten Modells (auch wenn es vage ist) macht es somit zu einem Formalismus einer Art. Mathematik lässt sich gut auf diesen vagen Bereich übertragen, obwohl die allgemeine Wahrnehmung davon auf die glänzende, kristallklare Welt klar definierter strenger Modelle beschränkt ist.
SK-logic
1

Ich denke, "The Little Schemer" ist eine großartige Einführung in die funktionale Programmierung und überhaupt nicht mathematisch. Es geht nicht in Monaden über, ist also für Ihren Geschmack vielleicht zu einfach, führt aber gegen Ende eine Herleitung des Y-Kombinators durch.

Ich habe es kürzlich durchgearbeitet, nachdem ich seit dem College vor 12 Jahren keine funktionale Programmierung durchgeführt hatte, und es war eine großartige Auffrischung. Ich fühle mich definitiv bereit, fortgeschrittenere Dinge anzugehen, nachdem ich die meisten Probleme in dem Buch mit Racket gelöst habe.

Paul Sanwald
quelle