Ich bin ein absoluter Neuling in Haskell, der versucht zu verstehen, wie es funktioniert.
Ich möchte meine eigene faule Liste von ganzen Zahlen wie [1,2,3,4,5 ...] schreiben.
Für eine Liste von denen, die ich geschrieben habe
%Vor%und wenn es versucht wird, funktioniert es gut:
%Vor%Wie kann ich das gleiche für steigende Ganzzahlen tun?
Ich habe es versucht, aber es scheitert tatsächlich:
%Vor%Und wie kann ich dann eine Methode erstellen, die zwei Streams multipliziert? wie:
%Vor% Die Gründe dafür, dass int = 1 : head [ int + 1]
nicht funktioniert, sind:
:
muss eine Liste sein. int + 1
versucht eine Liste und eine Nummer hinzuzufügen, was nicht möglich ist. Der einfachste Weg, eine Liste zu erstellen, die von 1 bis unendlich hochzählt, ist [1..]
Um in anderen Schritten als 1 zu zählen, können Sie [firstElement, secondElement ..]
, z. um eine Liste aller positiven ungeraden ganzen Zahlen zu erstellen: [1, 3 ..]
Um unendliche Listen der Form [x, f x, f (f x), f (f (f x)),...]
zu erhalten, können Sie iterate f x
, z. iterate (*2) 1
gibt die Liste [1, 2, 4, 16,...]
zurück.
Um eine Operation paarweise auf jedes Elementpaar zweier Listen anzuwenden, verwenden Sie zipWith:
%Vor%Um diese Definition übersichtlicher zu gestalten, können Sie das point-free Formular verwenden:
%Vor%Für natürliche Zahlen müssen Sie map verwenden:
%Vor%Oder Verständnis:
%Vor%Oder natürlich:
%Vor%Ich bin mir nicht sicher, ob das das ist, was Sie gefragt haben, aber es scheint mir, dass Sie eine Liste von steigenden natürlichen Zahlen erstellen wollten, ohne sich auf irgendeine andere Liste zu verlassen. Mit diesem Token können Sie also Dinge wie
tun %Vor%Das wird technisch eine akkumulierende Funktion genannt (ich glaube) und dann haben wir nur einen speziellen Fall davon gemacht, der leicht mit 'lst'
verwendbar istDu kannst von dort aus verrückt werden und Dinge tun wie:
%Vor%und so weiter, obwohl das wahrscheinlich auf etwas basiert, das Sie noch nicht gelernt haben (wo) - nach dem OP - aber es sollte immer noch ziemlich leicht lesen.
Oh, richtig, und dann die Listenmultiplikation. Nun, Sie können zipWith (*) wie oben erwähnt verwenden, oder Sie könnten das Rad so neu erfinden (es macht mehr Spaß, vertrauen Sie mir:)
%Vor%Der Grund für Safemul, glaube ich, können Sie herausfinden, indem Sie mit der Funktion experimentieren, aber es hat mit "Schwanz" zu tun. Das Problem ist, dass es keine Gründe für eine leere Liste, nicht übereinstimmende Listen usw. gibt, so dass Sie entweder verschiedene Definitionen (lmul _ [] = []) zusammenhacken müssen oder Wächter und oder wo und so weiter verwenden müssen ... oder bleibe bei zipWith:)
Tags und Links haskell stream list lazy-evaluation