www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Ullus Parvus

Gepostet:
05.12.2010 18:18

Arbeiten mit unendlichen Listen  
Hi,

ich habe zwei Funktionen geschrieben, die mir 2 Arten von unendlichen Listen erzeugen.
Zum einen

fromN :: Integer -> [Integer]
fromN n = [n..]

und

fromNM :: Integer -> Integer -> [Integer]
fromNM n m = [n, m..]

Da hört's dann mit meinem Können aber auch schon auf.
Ich soll jetzt

1. eine Funktion summ :: [Integer] -> [Integer] schreiben,
die für eine unendliche Liste die Liste der Summen benachbarter Zahlen als unendliche Liste zurückgibt.

2. einen Wert oneZero :: [Interger] definieren, welcher die Liste repräsentiert, die mit eins anfängt und dann undendlich viele Nullen enthält.

3. eine Funktion dropDivN :: Int -> [Integer] -> [Integer] schreiben, welche aus einer undendlichen Liste von Zahlen alle entfernt, die durch die übergebene Zahl n teilbar sind.

4. die Funktion dropDivN verwenden, um nach dem Prinzip des "Sieb des Eratosthenes" den Wert primes :: [Integer] zu definieren, der die undendliche Liste aller Primzahlen darstellt.

Ich sitze bestimmt schon 2 Stunden an dem Kram, ohne auch nur den Funken eines Ansatzes hinzubekommen.
Wäre schön, wenn mir jemand hilft.

Danke.

Liebe Grüße
Zum Seitenanfang    
 
Siracusa

Gepostet:
05.12.2010 20:28

   
Hallo,

woran scheitert es denn, an der Syntax oder dem Algorithmus? Die Funktionen zu 1.) und 2.) sind ja recht einfach, bei 1.) holst du dir die ersten beiden Elemente der Liste durch Musteranpassung und hängst die Summe von beiden an die rekursiv berechnete Restliste. 2.) kannst du über List Comprehensions erzeugen, oder mittels fromNM. 3.) wäre auch nicht so schwierig, wenn du durch die Liste läufst und für jedes Element die Teilbarkeit bestimmst, und, sofern es nicht teilbar ist, das Originalelement wieder in die Ergebnisliste nimmst, andernfalls einfach weglässt. 4.) wird dann etwas kniffliger.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Landei

Gepostet:
21.01.2011 10:06

   
Mal aus der Hüfte:

1) summ xs = zipWith (+) xs (tail xs)

2) oneZero = 1 : [0,0..]

3) dropDivN n xs = filter (\x -> x `mod` n /= 0) xs

4) primes' = eratos [2,3..] where eratos (p:ps) = p : eratos (dropDivN p ps)

Wie immer gilt: Hoogle ist dein Freund.
Zum Seitenanfang    
 
Anfaenger

Gepostet:
21.02.2011 11:58

zu oneZero  
Hi,

wir mussten die gleichen Funktionen mal schreiben, ich habe die oneZero damals in zwei funktionen geschrieben.

zero :: [Integer]
zero = 0 : zero

oneZero :: [Integer]
oneZero = 1 : zero


viele Grüße Matthias
Zum Seitenanfang ICQ    
 
Landei

Gepostet:
21.02.2011 14:11

   
Deine Version ist korrekt, aber ich finde

oneZero = 1 : [0,0..]

lesbarer. Dafür gibt es ja die spezielle Listen-Syntax. Insgesamt gibt es in Haskell einen starken Hang dazu, die Rekursion eingebauten Funktionen zu überlassen. Eine andere Version könnte man mit der Funktion iterate realisieren:

oneZero = iterate (const 0) 1



Ich sehe gerade, dass man bei der dritten Frage auch kürzer

dropDivN :: Int -> [Integer] -> [Integer]
dropDivN n = filter (/= 0).(`mod` n)

schreiben kann, aber ob das lesbarer ist, sei dahingestellt Smilie
Zum Seitenanfang    
 
Siracusa

Gepostet:
21.02.2011 18:04

   
> dropDivN :: Int -> [Integer] -> [Integer]
> dropDivN n = filter (/= 0).(`mod` n)

Das klappt so aber nicht, da fehlt entweder ein map hinten (filter (/= 0) . map (`mod` n)) oder eine zusätzliche Klammerung (filter $ (/= 0) . (`mod` n)).


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Landei

Gepostet:
21.02.2011 20:26

   
Stimmt, es sollte

dropDivN n = filter ((/= 0).(`mod` n))

heißen (oder halt mit $).
Zum Seitenanfang