Wie bin jetzt etwas weiter in Haskell. Ich denke jetzt darüber nach, wie ich die bekannten Konzepte nach Haskell rüberbringe. Auffällig ist, dass Python viel von Haskell ausgeliehen hat. Vergleiche ... import Data.Char import Data.Char as DC import sys import sys as system oder auch die list comprehensions, tupel [(i,j) for i in range(10) for j in range(10) if i+j % 2 == 0] [(i,j) | i<-[0..9], j<-[0..9], mod i+j 2 == 0] ähnlich ist die Situation beim funktionaltypischen filter, map, all, any, ... mir fällt das Haskell'sche Pendant zum Python'ischem Ausdruck filter(lambda x: type(x) in [int,float], [1,2.0,"3"]) how can i do it? ich bin mir gar nicht sicher ob heterogene Listen in Haskell möglich sind. Immerhin sind die Prototypen meist als [a] angebenen. Teilweise mit Einschränkung auf TypeClass (in meinen Augen eine Sicherstellung eines Interfaces) add::(Num a)=>a->a->a add x y = x + y Wäre cool etwas Hilfe zu bekommen^^ Grüsse, daniel
sorry noch vergessen. ich bin sehr schlecht in python, kannst du mir sagen, was der Ausdruck filter(lambda x: type(x) in [int,float], [1,2.0,"3"]) genau tut?
type(x) liefert den Typ zu einem Ausdruck für die gebräuchlichsten Typen kommt dann: int .. integer long .. integers beliebiger länge float .. floating point str .. strings (char ist string mit lange 1) in ist ein operator der True oder False zurückgibt, je nachdem ob x in einer Sequenz ist 1 in [1,2,3] => True "hello" in "hello world" => True insgesamt werden aus der heterogenen liste alle elemente herausgefischt, die "Zahlen" sind, also int,float (long hab ich jetzt nicht drin) soweit ich jetzt Haskell verstehe, gibt es keine heterogenen listen vielleicht ist übliche weg dafür tupeln zu benutzen? grüsse & gute nacht
Okay, ich weiss jetzt zwar nicht genau, ob das dass ist was du suchst aber eine Heterogene Liste haette ich auf die schnelle so geloest:
1 | data HList el = EL | Itemi Int (HList el) | Itemf Float (HList el) |
2 | |
3 | |
4 | onlyInt::HList el->[Int] |
5 | onlyInt EL = [] |
6 | onlyInt (Itemi e hlist) = [e] ++ onlyInt hlist |
7 | onlyInt (Itemf _ hlist) = onlyInt hlist |
Der Aufruf
1 | onlyInt (Itemi 1 (Itemf 2.3 (Itemf 4.7 (Itemi 6 EL)))) |
liefert dann nur die Intwerte der HList
1 | [1,6] |
noch besser sollte es sogar so sein:
1 | data HList el = EL | Item ElemType (HList el) |
2 | |
3 | data ElemType = MyInt Int | MyFloat Float | MyChar Char |
4 | |
5 | onlyInt::HList el->[Int] |
6 | onlyInt EL = [] |
7 | onlyInt (Item (MyInt e) hlist) = [e] ++ onlyInt hlist |
8 | onlyInt (Item _ hlist) = onlyInt hlist |
Somit brauch man nicht jeden Typ einzeln abfangen. Aufruf sieht z.B. so aus:
1 | Main> onlyInt (Item (MyInt 5) (Item (MyInt 7) (Item (MyChar 'c') EL))) |
2 | [5,7] |
ja, es war sehr hilfreich im moment versuche ich zur übung die funktion words nachzuimpementieren ist es nicht möglich in einem muster die auftrennung vorzunehmen? mywords::[Char]->Char mywords (x":"y) = .... sodass y teilstring vor dem ":" und y der teilstring danach wird. grüsse, daniel
leider wurde der funktionsprototyp automatisch von der forumssoftware ummanipuliert. rückgabetyp ist [_[Char]_]
wenn ich das richtig sehe moechtest du die Woerter eines Textes trennen (die Newline und Leerzeichen entfernen) Ich hab das vor kurzem auch mal gebraucht, allerdings nur fuer Newline. Sollte aber ohne probleme auf space erweiterbar sein
1 | import IO |
2 | |
3 | main::IO() |
4 | main = readFile "text.txt" >>= \x -> |
5 | putStr (show (genWordList x)++"\n") |
6 | |
7 | genWordList::String->[String] |
8 | genWordList [] = [] |
9 | genWordList str = [take (findNewl str) str] ++ genWordList (drop ((findNewl str)+1) str) |
10 | |
11 | findNewl::String->Int |
12 | findNewl [] = 0 |
13 | findNewl ('\n':tail) = 0 |
14 | findNewl (h:tail) = (findNewl tail) + 1 |
ich hoffe ich konnte dir helfen
In Haskell ist words eine Standardfunktion: Prelude> :t words words :: String -> [String] Prelude> words "hallo bla\nhaus stuhl\nApfel" ["hallo","bla","haus","stuhl","Apfel"]
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.