Verwenden Sie map, um Elemente einer Liste durch (x-y) * (x-y) zu ersetzen, wobei y das Anfangselement ist

7

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.

%Vor%

Die genaue Frage, die ich gestellt habe, ist

  

Schreiben Sie eine Funktion rela , die als Argumente eine Ganzzahl x und eine Liste von Ganzzahlen verwendet. Es wird eine ähnliche Liste zurückgegeben, wobei jedoch jedes Element y durch (x-y)*(x-y) ersetzt wurde, z. B.

%Vor%

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%     
blane clorley 14.04.2012, 19:19
quelle

4 Antworten

10

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:

%Vor%

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]

aufrufen?     
Wes 14.04.2012, 19:26
quelle
10

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.

    
bbrittain 14.04.2012 21:53
quelle
2

Einfaches Beispiel:

%Vor%

Oder wollen Sie irgendwelche Perversionen? -) Hier sind Sie mit Applicatives:

%Vor%     
Danil Onishchenko 17.04.2012 03:36
quelle
0

Hallo, ich denke du meinst das:

%Vor%     
Zacharie 007 09.01.2016 12:11
quelle

Tags und Links