Ich habe ein paar Hausaufgaben zu erledigen und bin ein absoluter Neuling für Haskell. Die Frage, mit der ich Probleme habe, ist eine Funktion zu schreiben, die bei Angabe einer Ganzzahl x
und einer Liste ganzer Zahlen (x-y)*(x-y)
auf jedes Element in der Liste anwendet und die neue Liste ausgibt, wobei y
jedes Element der Eingabeliste.
Ich habe eine sehr grobe Idee, dass ich die Funktion map
verwenden muss, aber ich bin mir nicht sicher, wie ich das anstellen soll.
Ich habe mir Beispiele für die Quadrierung jedes Elements in einer Liste angeschaut und verstehe, wie das funktioniert, aber wie ich das (x-y)*(x-y)
mit y
als aktuelles Element implementiere, verblüfft mich völlig.
Die genaue Frage, die ich gestellt habe, ist
Schreiben Sie eine Funktion
%Vor%rela
, die als Argumente eine Ganzzahlx
und eine Liste von Ganzzahlen verwendet. Es wird eine ähnliche Liste zurückgegeben, wobei jedoch jedes Elementy
durch(x-y)*(x-y)
ersetzt wurde, z. B.
Ich habe es nach dem Durchlesen einiger Bücher geschafft zu arbeiten, aber der Code, den ich gemacht habe, vermisst das erste Element in der Liste. Irgendeine Erklärung warum?
%Vor%Zunächst sollten Sie wahrscheinlich eine separate Funktion erstellen, die das tut, was Sie wollen.
z.B.
%Vor%Jedes Mal, wenn Sie eine Funktion in Haskell mit mehreren Parametern erstellen, wird die Funktion tatsächlich "curriert", was bedeutet, dass Sie eine neue Funktion erhalten, wenn Sie das erste Argument darauf anwenden.
Sie würden also eine neue Funktion erhalten, indem Sie dies tun
%Vor% Der Ausdruck f 5
ist eigentlich eine Funktion
Und Sie können eine Zahl auf 'g' anwenden und x wird immer '5'
sein Wenn wir also eine Funktion erstellen wollen, die zwei Parameter, 'x' und 'y', verwendet und (x-y)*(x-y)
auf eine Liste anwendet, in der y das aktuelle Element ist, müssen wir nur noch folgendes tun:
Was Sie verwenden können, indem Sie squareDifference 5
oder eine andere Zahl als Argument aufrufen
Mit einer allgemeineren Version können Sie auch eine Liste übergeben
%Vor% Was würden Sie mit squareDifference 3 [1,2,3]
Verstehst du Lambda-Funktionen?
%Vor%ist was du brauchst.
currying ist noch besser, aber nicht so einfach.
bearbeiten:
mehr konzeptionell ...
map iteriert eine Liste, die eine Funktion anwendet.
%Vor%verwendet die oben erwähnte Curry-Technik. Sie könnten auch:
%Vor%um das Gleiche zu erreichen.
Einfaches Beispiel:
%Vor%Oder wollen Sie irgendwelche Perversionen? -) Hier sind Sie mit Applicatives:
%Vor%Tags und Links haskell list dictionary