Frage

Nachdem ich ein bisschen Schema von SICP gelernt hatte, begann ich, den kleinen Schemer (den ich ziemlich unterhaltsam finde) zu lesen und bin ungefähr ein viertes gemacht. Mir ist aufgefallen, dass ich viele (die meisten? Alle?) Lösungen schreiben kann, ohne Lambda zu verwenden, während der kleine Schemierer stets benutzt sie. Zum Beispiel ist die allererste Definition

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

Was, es sei denn, ich irre, einfacher so geschrieben werden kann wie

(define (atom? x) 
   (and (not (pair? x)) (not (null? x))))

Vermisse ich etwas Grundlegendes, wenn ich lambdalose Lösungen schreibe?

War es hilfreich?

Lösung

Ursprünglich, define hatte eine einzelne Syntax, um eine Variable auf einen Wert festzulegen. Das ist der Stil, der in so alten (und zeitlosen) Büchern verwendet wird. Später, define Ich habe eine andere Syntax als Verknüpfung, die Sie verwenden.

Nur zum Spaß, suchen Sie in Ihren Schema-Bibliotheken ein Makro, das die Nicht-Lambda-Form in das alte lambda-fahre erweitert.

Andere Tipps

Ich bevorzuge das stark die lambda-Heaststil zum Unterrichten, da er die Funktionserstellung expliziter macht, wie Jay sagt.

Beim Lernen beginnen die einfachen Funktionen, mit denen Sie beginnen atom? sind defineD auf der obersten Ebene. Dies bedeutet, dass es möglich und noch kompakter ist, die Funktion mit dem zu erstellen defun-Stil define du erwähnst.

Wenn Sie jedoch Funktionen als erstklassige Werte verwenden, z. B. als Argument für map, du wirst sehen lambda Zum ersten Mal, und es mag seltsamer und magischer erscheinen, als es wirklich ist.

Stattdessen, wenn Sie Ihre Funktionen mit definiert haben lambda Die ganze Zeit ist es weniger ein Sprung zu sehen, dass Funktionen wie jeder andere Wert sind. Sie sind zufällig auf der rechten Seite von define Ziemlich häufig, unterscheiden sich aber nicht von einer Zahl oder einer zitierten Konstante:

(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))

Natürlich unterstützt die Sprache beide Formen und kommt also irgendwann auf den Stil an. Für mich gibt es eine ansprechende Konsistenz in der Verwendung von define Wenn alle Ihre Funktionen mit gemacht werden lambda: Das erste Argument ist immer ein Symbol, und das zweite Argument ist nur jeder alte Ausdruck. Und die Tatsache, dass das lambda ist wie jeder alte Ausdruck eines der wichtigsten Dinge für jeden funktionalen Programmierer zu lernen.

Sie können sehen, wie Ihr Schema diese Verknüpfungen (MACROs) erweitert expand (falls unterstützt):

MzScheme 4.2.4 (mit DrScheme):

> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
  (add1)
  (lambda (x) (apply + '1 x)))

Chez Schema 8.0:

> (expand '(define (add1 x) (+ 1 x)))
(begin
  (set! add1
    (lambda (x)
      (+ 1 x)))
  (void))

Das lambda erscheint einfach als Tag.

Ich erinnere mich vage an einen Professor, der so etwas bespricht.

Ich denke, die Lambda -Lösung wird aus zwei Gründen verwendet:

Das erste ist rein historisch. Zu einem bestimmten Zeitpunkt war dies der einzige Weg, wie es möglich war. Einige Leute verwenden diese Methode immer noch.

Das zweite ist, dass einige Leute einfach gerne explizit über die Tatsache sind, dass eine Funktion erzeugt wird, und sie sehen gerne das Wort lambda.

Ich glaube also, dass die Wahl darauf hängt, was immer Sie persönlich am besten mögen.

Ich lese ein wenig über Lambda Calculus (lese "Die Implementierung funktionaler Programmiersprachen" von Simon Peyton Jones; kostenlose PDF online), während ich TLS verwende. Und das ist nur eine Vermutung, aber ich glaube, die Autoren von TLs möchten, dass Sie in Ihrem Denken wirklich lambda-haavy sind. Sie kommen nicht heraus und sagen es, aber es gibt Hinweise (siehe S. 107 von TLS), dass dies alles nur eine Übung in angewandtem Lambda Calc ist. Vielleicht sagen sie, ohne zu sagen: "Du machst Lambda -Abstraktionen, mein Freund!"

Der Little Schemer verwendet ein Pseudo-Code-Schema (um Vereinfachungen für Bildungszwecke zu vereinfachen und implementierungsunabhängig zu sein). Das heutige Standardschema hat eine Definition von Define, in der Sie implizit Lambda anrufen (siehe http://www.cs.cmu.edu/groups/ai/html/r4rs/r4rs_7.html). Das Little Schemer -Schema ist sehr einfach und beinhaltet diese alternative Form nicht.

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