www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Alexej

Gepostet:
12.06.2006 14:35

etwas zu delete oder filter, Aufgabe: Häufigkeit Teilstrings  
filter1 :: [(String, Integer)] -> [(String, Integer)]
filter1 ((x,n):[]) = [(x,n)]
filter1 ((x,n):list) = [(x,n)] ++ filter1 (delete (x,1) list)

mein Problem ist, dass ich jedes beliebige - sprich (x,egal) aber alle Elemnte mit (x,_) aus list entfernen will. Gibts da ne bessere Funktion als delete oder wie mache ich ihm es klar dass in list alle (x,_) gelöscht werden sollen? Hab das mit diesem _ Unterstrich probiert, klappt aber nicht.

nun delete
geht nur nach einem Import von List.
in der Aufgabe soll ich die Häufigkeit von Teilstrings berechenen
countString "Hallo Hallo!" 2
Ausgabe: (Ha,2),(ll,2),(o ,1),(o!,1)
nun mein countString gibt: (Ha,2),(ll,2),(o ,1),(Ha,1),(ll,1),(o!,1) aus
das soll so nicht sein - das wollte ich mit filter1 verhindern
geht aber nur wenn ich (x,1) weglösche.
nun das geht ja bei Hallo Hallo Hallo z.B. nciht mehr


module Blatt3 where
import List
count x (a,[])n r = n
count x (a,b) n r | x == (take r b) = count x (splitAt r b) (n+1) r
| x /= (take r b) = count x (splitAt r b) (n) r

filter1 :: [(String, Integer)] -> [(String, Integer)]
filter1 ((x,n):[]) = [(x,n)]
filter1 ((x,n):list) = [(x,n)] ++ filter1 (delete (x,1) list)


countString :: String -> Int -> [(String, Integer)]
countString [] r = []
countString x r = [(s,(count s (splitAt 0 x) 0 r))] ++ countString (drop r x) r
where s = take r x
Zum Seitenanfang    
 
Jacke

Gepostet:
12.06.2006 15:13

   
du könntest es so lösen

filter1 :: [(String, Integer)] -> [(String, Integer)]
filter1 [] = []
filter1 ((x,n):list)
|(n==1) =filter1 list
|otherwise =[(x,n)] ++ filter1 list


also du kannst keine liste vom typ [(String, Integer)] erstellen die so aus sieht liste =[("wort",1),("wort2",_)] das ist schon vom typ her falsch das zeichen _ muß schon ein int sein (also auch nen konkreter wert)

so würdest du z.b auf nen wert k vergleichen dafür muß ihn aber der benutzer mit eingeben, und er würde dann alle tupel mit k rauswerfen

filter1 :: [(String, Integer)] ->Integer-> [(String, Integer)]
filter1 [] k= []
filter1 ((x,n):list) k
|(n==k) =filter1 list k
|otherwise =[(x,n)] ++ filter1 list k

aufruf mit
>filter1 [("wort",1),("wort",2)] 2
[("wort",1)]
ich hätte delete garnicht benutzt...
ich hoffe das war die frage ^^



oder deine variante müßte dann so aussehen...du machst übrigens nen fehler wenn du das erste element nicht betrachtest

filter1 [] k= []
filter1 ((x,n):list) k= filter1 (delete (x,k) ((x,n):list)) k

(mein hugs kennt übrigens kein delete, was für eins verwendest du?) ich denke aber das du das delete nur einmal aufrufen mußt...

_ ist übrigens nur nen platzhalter also nicht das wunderwerk schlecht hin
Zum Seitenanfang    
 
Alexej

Gepostet:
12.06.2006 16:09

   
nun delete
geht nur nach einem Import von List.
in der Aufgabe soll ich die Häufigkeit von Teilstrings berechenen
countString "Hallo Hallo!" 2
Ausgabe: (Ha,2),(ll,2),(o ,1),(o!,1)
nun mein countString gibt: (Ha,2),(ll,2),(o ,1),(Ha,1),(ll,1),(o!,1) aus
das soll so nicht sein - das wollte ich mit filter1 verhindern
geht aber nur wenn ich (x,1) weglösche.
nun das geht ja bei Hallo Hallo Hallo z.B. nciht mehr


bis hirhin danke für deine gute Erklärung!
Zum Seitenanfang    
 
Alexej

Gepostet:
12.06.2006 17:51

   
ok hat jetzt doch hingehauen mit dem filtern Smilie die aufgabe könnte man auch anders lösen, nur fehlt mir noch das handling dafür
-trotzdem kann ich deine Mühe hier im Forum nur schätzen *thumbs up*
module Blatt3 where

count x (a,[])n r = n
count x (a,b) n r | x == (take r b) = count x (splitAt r b) (n+1) r
| x /= (take r b) = count x (splitAt r b) (n) r

filter1 :: [(String, Integer)] -> [(String, Integer)]
filter1 ((x,n):[]) = [(x,n)]
filter1 ((x,n):list) = [(x,n)] ++ filter1 [(z,n)|(z,n)<-list,z /= x]


countString :: String -> Int -> [(String, Integer)]
countString [] r = []
countString x r = filter1 ([(s,(count s (splitAt 0 x) 0 r))] ++ countString (drop r x) r)
where s = take r x
Zum Seitenanfang    
 
Jacke

Gepostet:
12.06.2006 18:22

   
import List
filter1 :: [(String, Integer)] -> [(String, Integer)]
filter1 ((x,n):[]) = [(x,n)]
filter1 ((x,n):list) = [(x,n)] ++ filter1 (rechne x (n-1) list)
where
rechne z 1 lis =delete (x,1) lis
rechne z n lis=rechne z (n-1) (delete (x,n) list)

liste= [("Ha",3),("ll",3),("Ha",2),("ll",2),("o ",1),("Ha",1),("ll",1),("o!",1)]


etwas umständlich aber geht

aufruf mit
>filter1 liste
Zum Seitenanfang    
 
Jacke

Gepostet:
12.06.2006 18:25

   
^^ zu spät ich seh grade du hattest schon geantwortet, deine lösung ist natürlich schicker
Zum Seitenanfang    
 
Alexej

Gepostet:
12.06.2006 19:33

   
aber genau auf deinen gedankengang hab ich hingearbeitet - was später scheiterte und ich es dann auf einem völlig anderen weg gelöst habe ^^ schöner oder nicht
Zum Seitenanfang