So erzwingen Sie die funktionale Programmierung auf Scala

7

Ich fange an, Funktionsprogrammierung zu lernen, und ich möchte wirklich Scala lernen, nicht Haskell oder Lisp.

Aber einige Leute behaupten, dass das Lernen von Scala als erster funktionaler Sprache das Lernen der Funktionalen Programmierung verlangsamt, weil Scala es erlaubt, beide Wege zu programmieren, und man neigt dazu, den prozeduralen Weg zu programmieren, wenn man mit einem harten Problem konfrontiert wird.

>

Meine Frage ist, wie kann ich sicherstellen, dass ich rein funktionell programmieren?

(ich meine, vielleicht bin ich nicht in der Lage, genau beide Stile zu unterscheiden, und ich programmiere versehentlich prozedural).

Ich weiß zum Beispiel, dass ich nur vals und nicht vars verwenden soll.

    
Márcio Paiva 07.05.2013, 11:42
quelle

5 Antworten

12

Die anderen Antworten haben einige gute Punkte gebracht, aber für einen Versuch, schnell einige Richtlinien zu umgehen, hier ist, wie ich anfangen würde:

Zunächst einige Dinge, die Sie vollständig vermeiden sollten:

  • Verwenden Sie nicht das Schlüsselwort var .
  • Verwenden Sie nicht das Schlüsselwort while .
  • Verwenden Sie nichts im scala.collection.mutable -Paket.
  • Verwenden Sie nicht die Methode asInstanceOf .
  • Verwenden Sie nicht null . Wenn du jemals auf null (im Code von jemand anderem) stößt, wickle es sofort in einen passenderen Datentyp (normalerweise macht Option es gut).

Dann ein paar Dinge, die man generell vermeiden sollte:

  • Seien Sie vorsichtig, wenn Sie etwas mit dem Rückgabetyp Unit aufrufen. Eine Funktion mit dem Rückgabetyp Unit macht entweder nichts oder handelt nur mit Nebenwirkungen. In einigen Fällen werden Sie nicht in der Lage sein, dies zu vermeiden (IO ist das Offensichtliche), aber wo Sie es anderswo sehen, ist es wahrscheinlich ein Zeichen der Unreinheit.
  • Seien Sie vorsichtig beim Aufruf von Java-Bibliotheken - sie sind normalerweise nicht auf funktionale Programmierung ausgelegt und erfordern oft, dass Sie den funktionalen Ansatz aufgeben.

Wenn Sie diese Dinge vermieden haben, was können Sie tun, um Ihren Code funktionsfähiger zu machen?

  • Wenn Sie eine direkte Rekursion durchführen, suchen Sie nach Möglichkeiten, sie durch die Verwendung von Kombinatoren höherer Ordnung zu verallgemeinern. fold ist wahrscheinlich Ihr größter Kandidat hier - die meisten Operationen auf Listen können in Form eines geeigneten fold implementiert werden.
  • Wenn Sie Destrukturierungsvorgänge an einer Datenstruktur (typischerweise durch Mustervergleich) sehen, überlegen Sie, ob Sie stattdessen die Berechnung in die Struktur aufheben und eine Destrukturierung vermeiden können. Ein naheliegendes Beispiel ist das folgende Code-Snippet:

    %Vor%

    kann ersetzt werden mit:

    %Vor%
Impredicative 07.05.2013, 13:28
quelle
12

Ich wage zu sagen, dass Ihr Ziel bereits irreführend ist:

  

Ich fange an, Funktionsprogrammierung zu lernen, und ich möchte wirklich lernen   Scala, nicht Haskell oder Lisp.

Wenn Sie wirklich daran interessiert sind, Konzepte der Funktionsprogrammierung zu lernen, warum verwenden Sie dann keine Sprache wie Haskell, die es (mehr oder weniger) nicht erlaubt, prozedurale oder objektorientierte Konzepte zu verwenden? Am Ende ist die Sprache "nur" ein Werkzeug, das Ihnen beim Erlernen von FP-Konzepten hilft, Sie könnten genauso gut viele Artikel über FP lesen. Zumindest theoretisch ist es in der Regel einfacher, Konzepte der Informatik mit konkreten Werkzeugen zu erlernen.

Wenn Sie andererseits daran interessiert sind, die Sprache Scala zu erlernen, warum sollten Sie dann nicht alle Funktionen nutzen, die sie bietet, unabhängig davon, ob sie aus der FP- oder der OO-Welt stammen?

Um mit einem etwas praktischen Hinweis abzuschließen: Sie könnten nach FP-Tutorials suchen, die Scala verwenden oder nach Blogeinträgen usw., die beschreiben, wie Sie bestimmte FP-Konzepte in Scala realisieren und versuchen, ihnen zu folgen. Auf diese Weise ist es weniger wahrscheinlich, dass Sie Nicht-FP-Konzepte verwenden.

    
Malte Schwerhoff 07.05.2013 12:33
quelle
8

Sie kaufen keine Ferarri, um Möbel zu liefern. Scala's grundlegende Stärke ist die Tatsache, dass es in deinen Worten in beide Richtungen geht :). Ob Sie in einem funktionalen Stil programmieren oder nicht, hängt von den Techniken ab, die Sie verwenden.

Das Beste, was Sie tun können, ist, grundlegende Konzepte der funktionalen Programmierung gründlich zu überprüfen und die entsprechende Scala-Implementierung der jeweiligen Konzepte zu suchen. Aber wenn Sie rein funktionalen Stil programmieren wollen, dann gehen Sie für Haskell, Lisp, Erlang, OCaml, oder was auch immer anderen rein funktionalen Dialekt.

Funktionale Programmierung

Einführung

Funktionales Denken

Scala

Wenn Sie Scala lernen wollen, dann achten Sie darauf, sowohl OO als auch FP in Ihre Lernkurve einzubeziehen. Lambda-Ausdrücke + OO-Konzepte + syntaktischer Zucker, ermöglicht durch IMHO, der fortschrittlichste Compiler auf dem Planeten, führt zu etwas ganz Erstaunlichem. Nutzen Sie es aus!

    
flavian 07.05.2013 12:35
quelle
2

Ich denke, dass Lernen kein linearer Prozess ist, es hilft, viele Möglichkeiten zu sehen, dasselbe zu tun, auch opportunistisch zu sein und alle verfügbaren Lernressourcen zu nutzen. Zum Beispiel bietet Martin Odersky, der Schöpfer von Scala, einen kostenlosen Kurs mit dem Titel "Functional Programming Principles in Scala" Ссылка Es gibt einige sehr gute Videovorlesungen und einige wirklich gute Aufgaben, bei denen der automatische Grader Ihnen sagt, dass Ihr Code nicht funktional genug ist und Sie Stilpunkte verlieren, weil Sie var anstelle von val

verwenden

Ich denke, die Sache, auf die Sie sich konzentrieren wollen, ist das Lernen des funktionalen Programmierparadigmas. Für mich bedeutet das Lernen eines Paradigmas, zu lernen, welche Arten von Problemen in einem Paradigma leicht zu lösen sind und in einem anderen Paradigma schwer zu lösen sind. Konzentriere dich auf das Paradigma und ich denke du wirst feststellen, dass das Lernen sowohl von Haskell als auch von Scala dir das funktionale Paradigma schneller lehren wird, weil du die Frage stellen kannst, was die gemeinsamen Merkmale zwischen Scala und Haskell sind, was sind die Unterschiede. .. usw.

    
ams 07.05.2013 13:06
quelle
1

I know, for example, that I should only use vals and not vars.

Das ist schon ein guter Anfang, andere nicht zu funktionierende Dinge sind veränderbare Sammlungen und Schleifen.

Sehen Sie sich stattdessen unveränderliche Sammlungen und Rekursionen an.

Sobald Sie mit den funktionalen Konzepten vertraut sind, kann es natürlich auch gute Gründe geben, die nicht-funktionalen Funktionen von scala zu verwenden.

    
ValarDohaeris 07.05.2013 12:45
quelle

Tags und Links