2013-02-18 5 views
6

In Schema, das eine funktionale Programmiersprache ist, gibt es keine Zuweisungsanweisung. Aber in einer let AussageSchema let Anweisung

(let ((x 2)) 
    (+ x 3)) 

Du 2-x zuweisen, also warum diese nicht gegen den Grundsatz, dass es keine Zuweisungsanweisungen in der funktionalen Programmierung ist?

Antwort

11

Die Anweisung "Schema, die eine funktionale Programmiersprache ist" ist falsch. In Schema wird ein funktionaler Programmierstil empfohlen, aber nicht erzwungen. In der Tat können Sie set! (eine Zuweisungsanweisung!) Verwenden, um den Wert einer Variablen ändern:

(define x 10) 
(set! x (+ x 3)) 
x 
=> 13 

In Bezug auf der let Erklärung der Frage, denken Sie daran, dass ein Ausdruck wie dieser:

(let ((x 10)) 
    (+ x 3)) 
=> 13 

... es ist nur syntaktischer Zucker, und unter der Haube ist es wie folgt umgesetzt:

((lambda (x) 
    (+ x 3)) 
10) 
=> 13 

Beachten sie, dass ein.210 führt eine einmalige single assignments auf seine Variablen, so dass es keine rein Funktionsprinzip Programmierung verstößt per se, kann die folgende eines let Ausdruck bestätigt werden:

Eine Auswertung eines Ausdrucks nicht hat ein Nebeneffekt, wenn sie und erzeugt für gleichen Eingang

auch Zitat aus Wikipedia gleichen Werten keinen beobachtbaren Zustand der Maschine ändern:

Unreine funktionale Sprachen bieten sowohl eine einfache Zuweisung als auch eine echte Zuweisung (obwohl eine echte Zuweisung in der Regel weniger häufig als in imperativen Programmiersprachen verwendet wird). Zum Beispiel in Schema sowohl Einzelbelegung (mit let) und wahrer Zuordnung (mit set!) kann auf allen Variablen verwendet werden, und spezialisierte Primitiven sind für destruktive Updates innerhalb von Listen, Vektoren, Strings usw. versehen

+1

A funktionale Programmiersprache fördert und bietet Funktionen für die funktionale Programmierung, setzt diese aber nicht notwendigerweise durch. – ThePiercingPrince