www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

dodo

Gepostet:
17.01.2010 12:27

sekunden  
Hallo zusmmen,
ich hab seit heute mit haskell angefangnund bin ein blutiger Anfänger.
ich hab 2 bitte an euch:
1) ein für anfänger gutes haskell buch in deutsch
2) die berechnung von sekunden, so dass wenn man 5 4 3 eingibt dann 18243 rauskommt
also viel hab ich net geschafft:
sekunden:: Int-> Int -> Int
sekunden (x:y:z) = x* 3600 + y*60 + z
da kriege ich aber fehler.... kann mir einer sagen wo und was ich ändern soll?
THX
Zum Seitenanfang    
 
Siracusa

Gepostet:
17.01.2010 13:53

   
Hallo,

zu 1) Deutsche Haskell-Bücher sind mir gar nicht bekannt. Zu empfehlen ist Graham Huttons Programming in Haskell.

zu 2.) Da sind gleich mehrere Fehler in der Funktion. Der Typ ist Int -> Int -> Int, d.h. zwei Eingabe-Parameter vom Typ Int und ein Rückgabewert vom Typ Int. Du brauchst aber offensichtlich drei Eingabe-Parameter + Rückgabewert. Dann weiter (x:y:z) heißt, x und y sind zwei Werte vom Typ irgendwas, z ist dann eine Restliste vom Typ [irgendwas], denn der : verknüpft ein Wert mit einer Liste. Deinem Funktionstyp nach solltest du die Funktionsdefinition also einfach so schreiben: sekunden x y z = ... .


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
dodo

Gepostet:
17.01.2010 14:52

   
ahh vielen Dank!!!
jetzt angenommen ich hab eine liste mit vieln listen da drinne [[1,2][5,6]] un möchte eine liste ausgeben mit den werten und selbe Reihnfolge [1,2,,5,6]
muss ich dann so schreiben ???
f::[Int]->[Int]
f [xs] = [xs] ????
Zum Seitenanfang    
 
Siracusa

Gepostet:
17.01.2010 15:57

   
[Int] ist eine Liste mit Ints, [[Int]] wäre dann eine Liste von Listen mit Ints. Bei der Definition müsstest du unterscheiden zwischen leerer Liste und einer Liste mit mindestens einem Element und Restliste. Das sieht dann etwa so aus:
f :: [[Int]] -> [Int]
f [] = ... keine Listen mehr in der Liste = Rekursionsende
f (x:xs) = ... rekursiv f auf xs anwenden und mit x verbinden
Ich würde empfehlen, du schaust dir erstmal ein Tutorial an (z.B. http://en.wikibooks.org/wiki/Haskell), um etwas besser in die Sprache reinzukommen.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
dodo

Gepostet:
17.01.2010 19:56

   
hmm ich find keine gute seite, wo man es gut beigebraht bekommt...
also hab deinem vorschlag befolgt und das ist rausgekommen.
flach :: [[Int]] -> [Int]
flach [] = []
flach (x:xs) = flach xs++ x
und vielen dank es funzt :)
Zum Seitenanfang    
 
dodo

Gepostet:
17.01.2010 21:52

   
Ich hab noch ne Frage, aber diesmal über wurzel.
also ich weiss dass man so die wurzel berechnet:
wurzel :: Double->Double -> Int
wurzel x y= truncate (sqrt x)
aber wie kann ich denn die n-te wurzel berechnen?????
Zum Seitenanfang    
 
Siracusa

Gepostet:
17.01.2010 22:38

   
Hhm, dazu gibt es im Prelude soweit ich weiß keine Funktion. Du kannst auf Hackage (http://hackage.haskell.org) nachschauen, da gibt es garantiert eine Mathe-Bibliothek die sowas kann. Ansonsten bleibt noch die Umrechnung: n-te Wurzel aus x = exp (log x / n).


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
dodo

Gepostet:
18.01.2010 15:43

   
1)
also ich darf nur teilweise die vordefinierte funktionen benutzen:
also ich hab mir so über legt: angenommen x = 4 , und da ich die 3-te wurzel berechnen muss mach ich dann so:
1 ^3 = 1 < 4
2^3 = 8 > 4 also das ergebnis ist dann 1.
wurzel1 :: Int -> Int
wurzel1 x = if( ( x - ( x-1 ) ) ^3 < x )

so weit bin ich schon gekommen weiss aber net weiter ....
kann mir einer helfen?

2)
ich hab ne liste [1,2,5,4,7] und möchte ne zahl einfügen z.b. 4und dann diese liste sortieren. also so:
4[1,2,4,4,5,7]
kann mir da auch einer hefen pls??

einfüge :: Int -> [Int]-> [Int]
einfüge x [] = 0
einfügen x (y:ys) = if (x==y) then einfügen x ys
Zum Seitenanfang    
 
Siracusa

Gepostet:
18.01.2010 17:23

   
zu 1.) Also willst du nur ganzzahlige Wurzeln berechnen? Dann brauchst du bei deiner Funktion einen Int-Parameter n, der am Anfang 0 ist und bei jeder Rekursion um 1 erhöht wird. Wenn dann (n+1)^3 > x ist, ist n die ganzzahlige Wurzel.

zu 2.) Zu dem if/then gehört in Haskell immer ein else. Schau dir mal Guards an ("http://en.wikipedia.org/wiki/Guard_(computing)"), wenn du die statt if/then/else benutzt wird's vermutlich einfacher und übersichtlicher.


Viele Grüße,

Siracusa
Zum Seitenanfang