Gepostet: |
Typfehler | ||||||||||
Hallofloorz::Float->Int Fehlermeldung: Type error in aplication *** Expression : x < i + 1 *** Term : x *** Does not match : Int Kann mir hier einer sagen, warum der Fehler kommt und was ich dagegen tun kann? mfg Hellraiser |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
die methode round wandelt dir einen float in einen int um also floorz x=round x gruß jacke |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Also falls du darauf hinaus willst, dass du den ganzzahligen Anteil einer Zahl (abgerundet) haben möchtest und Jacke dich falsch verstanden hat, so kann ich dir nur Folgendes empfehlen:floorz::Float->Int Alternativ - falls du doch etwas anderes machen willst, dann solltest du die Funktion auf Integer umstellen und die Funktion fromInteger benutzt. Mit etwas Glück ist im Prelude bei dir auch fromInt im Prelude definiert, dann kannst du natürlich auch diese Funktion nehmen und musst die Funktionssignatur nicht ändern. |
|||||||||||
Zum Seitenanfang | Homepage ICQ | ||||||||||
Gepostet: |
|||||||||||
Es ist so: Es wird eine Floatzahl eingegeben (zb. 2.4 oder -2.3) und dieses Programm soll dann eine Intzahl finden die folgende Bedingung erfüllt: x ist eine Floatzahl die vom Benutzer eingegeben wird i ist mit 0 vordefiniert und soll hinaufgezählt werden, bis die Bedingung erfüllt ist i <= x und x < i+1 Wenn diese Bedingung erfüllt ist, soll i ausgegeben werden (das soll nun eine Integerzahl sein) Also bei: floorz 2.3 => 2 floorz (-2.3) => -3 Das Programm funktioniert soweit, nur dass die Ausgabe eben ein Float ist und kein Int. (also 2.0 bzw. -3.0) |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Also ich würde da natürlich die Version bevorzugen, die ich dir gegeben hab (weil einfach). Ansonsten musst du irgendwie sowas nutzen (nicht getestet):floorz::Float->Int Oder, wenn bei dir fromInt im Prelude definiert ist: floorz::Float->Int |
|||||||||||
Zum Seitenanfang | Homepage ICQ | ||||||||||
Gepostet: |
|||||||||||
Hab mal deine Version Probiert floorz::Float->Int floorz x = floor_ x 0 floor_::Float->Int->Int floor_ x i | intToFloat i <= x && x < intToFloat(i+1) = i | intToFloat i <= x = floor_ x i+1 | x < intToFloat(i+1) = floor_ x i-1 intToFloat :: Int -> Float intToFloat n = fromInteger (toInteger n) Bekomme aber leider nen Stack overflow, warum weis ich leider nicht. Naja vielleicht komme ich heute noch drauf Sag jetzt schon mal danke für die Hilfe |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Ist nun ne Kleinigkeit: In deiner Funktion floor_ steht:
Mit expliziter Klammerung auf den rechten Seiten sieht das ganze nach den Haskell-Prioritätsregeln so aus:
Du rufst die Funktion also rekursiv immer wieder mit den selben Parametern auf und bekommst irgendwann einen Stack-Überlauf. Korrekt sollte das dann so aussehen:
Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Vielen vielen Dank, jetzt klappt es mfg Hellraiser |
|||||||||||
Zum Seitenanfang | |||||||||||