www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

hYpa0cw

Gepostet:
27.04.2012 18:21

isDigit auf Liste anwenden  
Hallo,

ich bin totaler anfänger und verzweifle wahrscheinlich an etwas ziemlich simplen:
Ich habe eine Liste list = [\"a 1\", \"AA BB\", \"qwertz\", \"z20\", \"2+2\", \"CD\", \"aB\", \"A\", \"B\", \"C\", \"D\"] und will mit isDigit kontrollieren welche Elemente dieser Liste eine Zahl enthalten und diese dann entfernen. Leider scheiter ich schon an dieser kontrolle :D

Ich habs einfach versucht mit:

bla = map isDigit (list)

aber so kommt schon beim versuch das Programm zu laden ein Fehler...

Würde mich sehr über Hilfe freuen :D

EDIT: Die \\ sollten eigentlich nicht in der Liste sein^^

mfg
Zum Seitenanfang    
 
IKT

Gepostet:
27.04.2012 19:00

   
>map isDigit (list)

Überprüfe ob die Typen stimmen: (von Funktionen die du nicht kennst kannst du sie über http://www.haskell.org/hoogle/ nachschlagen)

map :: (a -> b) -> [a] -> [b ]
isDigit :: Char -> Bool
also map isDigit :. [Char] -> [Bool] wobei [Char] von String repräsentiert wird.

map isDigit bekommt aber keinen String, sondern [String], eine Liste von Strings, übergeben. Du müsstest das ganze also noch einmal mappen:
map (map isDigit) :: [[Char]] -> [[Bool]]. Nun passt es von den Typen her und du würdest für z.B. für map (map isDigit) [\\\\\\\"a 1\\\\\\\", \\\\\\\"AA BB\\\\\\\"] als Ergebnis [[False,False,True],[False,False,False,False,False]] bekommen.

Für deinen Fall bietet sich die vordefienrte Funktion filter ( http://www.haskell.org/hoogle/?hoogle=filter ) an:

filtereListe :: [String] -> [String]
filtereListe liste = filter (\\string -> not (or (map isDigit string))) liste (for String soll nur ein \\)

oder schöner geschrieben:

filtereListe :: [String] -> [String]
filtereListe = filter (\\\\\\\\string -> not (or (map isDigit string)))

(\\\\\\\\string -> not (or (map isDigit string)) ist hierbei die Funktion die sich einen String aus der Liste nimmt und sagt, ob dieser den Anforderungen entspricht und in der Liste verbleiben soll.




Zum Seitenanfang    
 
hYpa0cw

Gepostet:
27.04.2012 19:14

   
Danke für die schnelle antwort :)
Ich versuch den Code jetzt nur noch 100%ig zu verstehen... Mir ist nicht ganz klar warum jetzt not und or verwendet werden, kannst du das vielleicht kurz erklären?^^
Zum Seitenanfang    
 
Landei

Gepostet:
27.04.2012 20:40

   
Das not verwendet er, weil filter nur das in der Liste *behält*, was der Bedingung entspricht, also muss die Bedingung \"ist *keine* Zahl\" sein. or verknüft alle Elemente einer Liste mit ||, Der Ausdruck wird also wahr, wenn die Liste mindestens ein True enthält. Man kann also den filter-Ausdruck insgesamt so übersetzen: Behalte alle Elemente, bei denen nicht ein Buchstabe vorkommt, der eine Ziffer ist.

Nach Herrn de Morgan könnte man das not auch \"nach innen\" ziehen, wobei aus dem or ein and wird: nicht (A oder B) == (nicht A) und (nicht B):

filtereListe = filter (\\string -> and (map (not.isDigit) string)))


and map lässt sich noch durch die Funktion all ersetzen:


filtereListe = filter (\\string -> all (not.isDigit) string)


Das liest sich fasst schon wie Prosa: Behalte alle Elemente, bei denen alle Buchstaben keine Ziffern sind.

Etwas ähnliches könnte man mit der ursprünglichen Version machen, nur dass aus or map ein any wird:

filtereListe = filter (\\string -> not $ any isDigit string)


Das liest sich dann als: Behalte alle Elemente, bei denen es nicht einen einzigen Buchstaben gibt, der eine Ziffer ist.

Und diese Version lässt sich tatsächlich nochmal verkürzen, in dem wir den Lambda-Ausdruck punktfrei machen:


filtereListe = filter (not . any isDigit)


Auch die and-Version geht punktfrei:


filtereListe = filter $ all (not.isDigit)


Ist Haskell nicht toll?
Zum Seitenanfang    
 
hYpa0cw

Gepostet:
28.04.2012 01:43

   
Danke das hilft mir wirklich enorm weiter :D
Ob Haskell toll ist kann ich im moment noch nicht beurteilen aber ich fand Python auf jeden fall anfängerfreundlicher und ansonsten habe ich keine großen Programmierkenntnisse^^
Zum Seitenanfang