www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Hellraiser

Gepostet:
04.11.2006 18:14

Typfehler  
Hallo

floorz::Float->Int
floorz x = floor_ x 0

floor_::Float->Int->Int
floor_ x i | i <= x && x < i+1 = i
| i <= x = floor_ x i+1
| x < i+1 = floor_ x i-1


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    
 
Jacke

Gepostet:
04.11.2006 19:37

   
die methode round wandelt dir einen float in einen int um
also floorz x=round x

gruß jacke
Zum Seitenanfang    
 
Jammni

Gepostet:
04.11.2006 19:46

   
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
floorz x = round(x - 0.5)


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    
 
Hellraiser

Gepostet:
04.11.2006 20:00

   
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    
 
Jammni

Gepostet:
04.11.2006 22:06

   
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
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)

Oder, wenn bei dir fromInt im Prelude definiert ist:
floorz::Float->Int
floorz x = floor_ x 0

floor_::Float->Int->Int
floor_ x i | fromInt i <= x && x < fromInt(i+1) = i
| fromInt i <= x = floor_ x i+1
| x < fromInt(i+1) = floor_ x i-1


Zum Seitenanfang Homepage   ICQ    
 
Hellraiser

Gepostet:
05.11.2006 22:24

   
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    
 
Siracusa

Gepostet:
05.11.2006 22:49

   
Ist nun ne Kleinigkeit:

In deiner Funktion floor_ steht:

| intToFloat i <= x = floor_ x i+1
| x < intToFloat(i+1) = floor_ x i-1

Mit expliziter Klammerung auf den rechten Seiten sieht das ganze nach den Haskell-Prioritätsregeln so aus:

| intToFloat i <= x = (floor_ x i) + 1
| x < intToFloat(i+1) = (floor_ x i) - 1

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:

| intToFloat i <= x = floor_ x (i+1)
| x < intToFloat(i+1) = floor_ x (i-1)


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Hellraiser

Gepostet:
06.11.2006 12:37

   
Vielen vielen Dank, jetzt klappt es


mfg
Hellraiser
Zum Seitenanfang