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.
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:
var
. while
. scala.collection.mutable
-Paket. asInstanceOf
. 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:
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. Wenn Sie diese Dinge vermieden haben, was können Sie tun, um Ihren Code funktionsfähiger zu machen?
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%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.
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
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!
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
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.
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.
Tags und Links scala