Ich versuche, eine Liste in haskell so zu ändern, dass zwischen jedem Element 0 steht. Wenn wir eine erste Liste haben, [1..20]
würde ich sie gerne ändern[1,0,2,0,3..20]
Was ich mir überlegt habe, ist, für jede Funktion eine Karte zu verwenden, ein Element zu extrahieren und es dann zur Liste hinzuzufügen und zu verwenden ++[0]
, aber nicht sicher, ob dies der richtige Ansatz ist oder nicht. Habe noch Haskell gelernt, könnte also Fehler haben.
Mein Code:
x = map classify[1..20]
classify :: Int -> Int
addingFunction 0 [Int]
addingFunction :: Int -> [a] -> [a]
addingFunction x xs = [a] ++ x ++ xs
Sie können dies nicht mit tun
map
. Eine der grundlegenden Eigenschaften vonmap
ist, dass seine Ausgabe immer genau so viele Elemente enthält wie seine Eingabe, da jedes Ausgabeelement einer Eingabe entspricht und umgekehrt.Es gibt jedoch ein verwandtes Tool mit der erforderlichen Leistung:
Auf diese Weise kann jedes Eingabeelement null oder mehr Ausgabeelemente erzeugen. Sie können dies verwenden, um die gewünschte Funktion zu erstellen:
Oder eine präzisere Definition von
between
:quelle
Mit einfachem Mustervergleich sollte es sein:
quelle
Wenn Sie
map
dies lösen möchten , können Sie Folgendes tun:Haben Sie eine Funktion, die ein int erhält und 2 Elementlisten mit int und Null zurückgibt:
Dann können Sie map mit dieser Funktion aufrufen:
Sie werden feststellen, dass es sich um eine verschachtelte Liste handelt. So
map
funktioniert es. Wir brauchen eine Möglichkeit, die innere Liste zu einer einzigen Liste zusammenzufassen. Diesen Fall verwenden wirfoldl
In diesem Fall funktioniert Foldl also so, dass es eine Kombinationsfunktion, einen Anfangswert und die zu kombinierende Liste akzeptiert.
Da wir die erste 0 nicht brauchen, können wir sie fallen lassen:
Endgültiger Code:
quelle
foldl (++) []
ist ein bisschen komisch. Warum nicht einfach darauf zeigenconcat
?concat
Implementierung selbst auch irgendeine Art von verwendetfold
. Ich denke, die Verwendungfoldl
würde anderen helfen, es ein bisschen tiefer zu verstehen.concat
wirdfoldr
eher mit als implementiertfoldl
. Verstehst du, warum das eigentlich wichtig ist?fold
mir nicht ganz . Es gibt ein ganzes Wiki zu diesem Thema. Mein einfaches Verständnis ist, dass diesfoldr
für faule unendliche Listen viel besser ist undfoldl
oderfoldl'
(strenge Version) für allgemeine Anwendungsfälle besser ist.Wir können hier ein
foldr
Muster verwenden, bei dem wir jedem Element in der ursprünglichen Liste Folgendes voranstellen0
:quelle
Wenn Sie nicht verwenden möchten
intersperse
, können Sie Ihre eigenen schreiben.Wenn Sie möchten, können Sie
Applicative
Operationen verwenden:Dies ist im Grunde die Definition in
Data.Sequence
.quelle