Haskell, Liste der natürlichen Zahl

8

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%     
Hellnar 21.03.2010, 13:03
quelle

4 Antworten

17

Die Gründe dafür, dass int = 1 : head [ int + 1] nicht funktioniert, sind:

  • head gibt ein einzelnes Element zurück, aber das zweite Argument für : 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%     
sepp2k 21.03.2010, 13:08
quelle
12

Für natürliche Zahlen müssen Sie map verwenden:

%Vor%

Oder Verständnis:

%Vor%

Oder natürlich:

%Vor%     
Łukasz Lew 21.03.2010 13:14
quelle
3

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 ist

Du 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:)

    
Hiato 21.03.2010 14:54
quelle
2

Dafür gibt es eine Syntax in der Sprache:

%Vor%

Sie können sogar verschiedene Schritte machen:

%Vor%     
clord 21.03.2010 14:38
quelle