Frage

Ich bin ein Haskell Neuling, hatte allerdings eine vorherige Lisp / Scheme Erfahrung. Im Moment bin ich Blick auf die Beispiele von SICP und versuchen, sie in Haskell zu implementieren, um mehr praktische Erfahrung zu bekommen. In dem Vortrag präsentieren 3b Autoren eine Funktion symbolisch die Derivate zur Berechnung. Es enthält unter anderem die folgenden Zeilen:

(define (deriv exp var)
    (cond ((constant? exp var) 0)
          ((same-var? exp var) 1)
; ...

Weitere in der Vorlesung werden einige weitere Funktionen definiert:

(define (constant? exp var)
    (and (atom? exp)
         (not (eq? exp var))))

Gibt es eine Möglichkeit gleiche Sache in Haskell, das heißt überprüfen für die Unteilbarkeit und symbolische Äquivalenz zu einer anderen Funktion zu tun? Oder allgemeiner, was sind die Mittel der „Demontage“ Funktionen in Haskell?

War es hilfreich?

Lösung

Ihr Schema Beispiele konzentrieren sich hierbei nicht wirklich Funktionen Scheme. Ich habe vor kurzem eine symbolische Differenzierung in Haskell über Werte des folgenden Typs:

data Exp a = Lit a
           | Exp a :*: Exp a
           | Exp a :+: Exp a
           | Var String
  deriving Eq

Anstelle der Verwendung von atom? Diskriminieren oder eq? Sie verwenden case (oder eine andere Pattern-Matching) und ==.

Andere Tipps

Zum einen, wenn auch SICP groß ist, würde ich davon abraten Haskell zu lernen. (#) Einige der Schwierigkeiten in dieser Frage aus dieser stammt.

In Lisp / Scheme, ein 'Funktion' ein Stück Code gedacht wird, und die Prüfung eine Funktion bedeutet einfach seinen Code zu untersuchen. In Haskell, eine ‚Funktion‘ etwas näher an seine mathematischen Definition bedeutet, als ein Karte von einer Menge A auf einen Satz B. So zum Beispiel, ist es sinnvoll, im Lisp Kontext, zwei Funktionen vergleichen: nur ihren Code vergleichen. (Aber sind (x+y)^2 und x^2+2*x*y+y^2 verschiedene Funktionen?) In Haskell, es hängt davon ab, ob es ein konstruktives Verfahren besteht Gleichheit für die Klasse von Funktionen für die Bestimmung Sie erwägen.

In ähnlicher Weise wie in Ihrer Frage, in Lisp / Scheme, würden Sie eine „ableiten“ Funktion schreiben, die richtig unterscheidet, wenn Ausdrücke gegeben, und nur Fehler oder gibt Müll auf beliebige Eingaben. Unter Haskells Typsystem, das ist (AFAIK) unmöglich zu tun, denn: Wenn Sie denken, es-gibt es nicht so etwas wie eine beliebige Eingabe Differenzierung: Sie können nur einen Ausdruck differenzieren können (oder möglicherweise eine allgemeine Klasse, aber immer noch nicht alles). So wie in der Antwort Norman Ramsey, Sie zuerst eine „Expression“ Typen (oder Typ-Klasse) definieren, die sehr einfach zu tun, und dann die Funktion schreiben

derive :: Expression -> Expression

, dass auseinanderbauen ein Expression der Musteranpassungs-Konstrukte (oder etwas anderes, je nachdem wie Expressions wurden aufgebaut).


(#): Der Grund dafür ist, dass SICP eine ganz andere Philosophie hat, die eine nicht typisiert Programmiersprache beinhaltet die Verwendung und fehlende Unterscheidung zwischen Code und Daten zu fördern. Zwar gibt es einige Verdienst der „code = Daten“ Argument ist (zum Beispiel die Tatsache, dass wir auf der von-Neumann-Architektur verwenden, „alles 0 und 1 ist sowieso“), ist es nicht unbedingt eine gute Art und Weise der Argumentation über oder Modellierungsprobleme. (Siehe Philip Wadler Warum Rechnen ist besser als Scheming für weitere Informationen hierzu.) Wenn Sie ein Haskell Buch mit einem funktionellen Geschmack anstelle einer Real World lesen mögen ein, vielleicht Simon Thompson Haskell: The Craft of Functional Programming oder Einführung in die funktionale Programmierung mit Haskell gibt bessere Alternativen.

Ich glaube nicht, dass Sie das tun können. Lisp ist homoiconic , Haskell ist es nicht.

sind jedoch weitere googeln aufgedreht Liskell , das ist (?) Ein interessanter Hybrid.

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