Forum: PC-Programmierung Gibt es hier Haskell user?


von daniel (Gast)


Lesenswert?

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

von Thomas Prescher (Gast)


Lesenswert?

ich glaube das was du suchst sind Klassen und Sorten (Kinds)

von Thomas Prescher (Gast)


Lesenswert?

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?

von daniel (Gast)


Lesenswert?

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

von daniel (Gast)


Lesenswert?

achso lambda ist unbenannte funktion

lambda x: x==1
(\x->x==1)

von Thomas Prescher (Gast)


Lesenswert?

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]

von Thomas Prescher (Gast)


Lesenswert?

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]

von daniel (Gast)


Lesenswert?

danke schon mal, probiere ich gleich aus wenn ich zu hause bin

von Thomas Prescher (Gast)


Lesenswert?

hat es dein Problem geloest?

von daniel (Gast)


Lesenswert?

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

von daniel (Gast)


Lesenswert?

leider wurde der funktionsprototyp automatisch von der forumssoftware
ummanipuliert. rückgabetyp ist [_[Char]_]

von Thomas Prescher (Gast)


Lesenswert?

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

von Jürgen B. (jubu)


Lesenswert?

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
Noch kein Account? Hier anmelden.