Gibt es hier Haskell user?

Gast #1050701
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
Gast #1050715
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
Gast #1050917
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]
Gast #1050979
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]
Gast #1052916
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
Gast #1053231
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren