Mithilfe der map zu ersetzen Elemente einer Liste mit (x-y)*(x-y), wobei y das erste element
Ich habe ein bisschen Hausaufgaben zu tun, und ich bin ein absoluter Neuling auf Haskell. Die Frage, die ich habe Probleme mit ist das schreiben einer Funktion, die eine gegebene ganze Zahl x
und eine Liste von ganzen zahlen gelten (x-y)*(x-y)
auf jedes element in der Liste und die Ausgabe der neuen Liste, mit y
wird jedes element der Eingangs-Liste.
Habe ich eine sehr grobe Idee, die ich mit der map
Funktion, aber ich bin mir nicht sicher wie Sie gehen über es.
Schaue ich Beispiele für die Quadratur jedes element in einer Liste und die Art verstehen, wie das funktioniert, aber wie würde ich die Umsetzung der (x-y)*(x-y)
mit y
wird das aktuelle element komplett verwirrt mich.
squares :: [Int] -> [Int]
squares (x:xs) = x * x : squares xs
squares [] = []
die genaue Frage, die ich mir gesetzt worden ist,
Schreiben Sie eine Funktion
rela
nimmt als Argumente ein integer -x
und eine Liste von Ganzzahlen. Es gibt eine ähnliche Liste, aber wo jedes elementy
wurde ersetzt durch(x-y)*(x-y)
z.B.Main> rela 2 [3,5,7] [1,9,25]
Ich habe es geschafft es zum laufen zu bringen nach dem Lesen durch einige Bücher, aber der code, den ich gemacht habe, findet sich das erste element in der Liste. Keine Erklärung warum?
equation1 :: Int -> Int -> Int
equation1 x y = (x-y)*(x-y)
rela :: Int -> [Int] -> [Int]
rela x [] =[]
rela x (y:ys) = [ equation1 x y | y <- ys ]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste von allen, sollten Sie wahrscheinlich erstellen Sie eine separate Funktion, die tut, was Sie wollen.
z.B.
Nun, jedes mal, wenn Sie erstellen eine Funktion in Haskell mit mehreren Parametern, die es eigentlich "Currys" die Funktion, die bedeutet, dass Sie eine neue Funktion, wenn Sie das erste argument für Sie.
So, Sie würden eine neue Funktion dadurch
Den Ausdruck
f 5
ist eigentlich eine FunktionUnd können Sie anwenden eine Anzahl an 'g' und x immer '5'
Also, wenn wir wollen, erstellen Sie eine Funktion, die zwei Parameter nimmt, 'x' und 'y', und gilt
(x-y)*(x-y)
zu einer Liste, wo y ist das aktuelle element, dann ist alles, was wir tun müssen, ist folgende:Die Sie verwenden können, durch aufrufen
squareDifference 5
oder jede andere Zahl als argumentEiner allgemeineren version, die Ihnen erlauben würde, eine Liste als auch
Denen man call-by-doing
squareDifference 3 [1,2,3]
map
, ruft eine Funktionf :: a → b
als parameter und wendet Sie auf alle Elemente der Liste, so dassmap f [x₀, x₁, x₂, x₃ ..] ≡ [f x₀, f x₁, f x₂, f x₃ ..]
. Dann erstellen Sie einfach partiell angewandte Funktion (siehe oben), und rufen Siemap
mit ihm. Die Typ-Signatur vonrela
entsprichtconcatMap
- und das ist nicht wirklich das, was Sie brauchen in diesem Fall.f x y = (x - y)^2
, das ist eine Funktion vom Typ (für die Einfachheit)Int → Int → Int
,map
erwartet, dass eine Funktion vom Typa → b
für einigea
undb
eine Liste von Werten des Typsa
(d.h.[a]
) und gibt eine Liste vonb
s. Seit Sie beginnen mit[Int]
und wollen, um am Ende mit[Int]
zu, haben Sie, um eine FunktionInt → Int
. Wenn Sie nur ein argument zuf
(wief 5
), erhalten Sie eine FunktionInt → Int
mit dem ersten argument fest (in diesem Beispiel 5).squareDifference 10 :: Num b => [b] -> [b]
verstehen Sie, lambda-Funktionen?
ist, was Sie brauchen.
currying ist noch besser, aber nicht so einfach.
edit:
mehr konzeptionelle...
map iteriert durch eine Liste anwenden einer Funktion.
verwendet das currying-Technik, die oben erwähnt. man könnte auch:
dasselbe erreichen.
repa x xs = map (lambda function) xs
Einfaches Beispiel:
Oder vielleicht möchten Sie alle Perversionen? -) Hier sind Sie mit Applicatives:
Hallo, ich denke mal du meinst diese: