www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Xan

Gepostet:
24.07.2012 23:01

Pythagoras_Zahlen  
Hallo,
diese Funktion bei der Eingabe von drei ganzen Zahlen entscheiden soll, ob es sich um Pythagoras_Zahlen handelt. Hugs gibt diesen Fehler raus :
\"Instance of Floating Int required for definition of pythagoras\"


pythagoras :: Int -> Int -> Int -> Bool
pythagoras a b c = if a == sqrt(c*c-b*b) && b == sqrt(c*c-a*a) && c == sqrt(a*a+b*b) then True else False


Zum Seitenanfang    
 
Landei

Gepostet:
24.07.2012 23:55

   
Das ist etwas komplizierter, wenn du Real- und Ganzzahlen mischst. Insbesondere die Monomorphismus-Restriktion ist hässlich. fromIntegral hilft bei solchem Code oft weiter.

Aber warum machst du es so kompliziert? Es muss doch nur a² + b² = c² gelten. Selbst wenn die Zahlen in beliebiger Reihenfolge kommen können, läuft es bloss hinaus auf


pythagoras :: Int -> Int -> Int -> Bool
pythagoras a b c = a^2 + b^2 == c^2 || a^2 + c^2 == b^2 || b^2 + c^2 == a^2
Zum Seitenanfang    
 
Xan

Gepostet:
25.07.2012 00:18

   
Es war echt dumm von mir so eine komplizierte Formel zu verwenden, wenn es doch einfacher geht. Danke schön
Zum Seitenanfang    
 
Landei

Gepostet:
26.07.2012 13:15

   
Man könnte noch versuchen, Code-Duplikation zu vermeiden:


pythagoras :: Int -> Int -> Int -> Bool
pythagoras a b c = triple a b c || triple b c a || triple c a b where
triple x y z = x^2 + y^2 == z^2


Statt einzelner Argument könnte man dann eine Liste nehmen, die sich leicht \"rotieren\" lässt (die Variante hier ist nur für kurze Listen geeignet):


import Data.List

pythagoras :: Int -> Int -> Int -> Bool
pythagoras a b c = or $ map tripel $ rot [a,b,c] where
triple [x,y,z] = x^2 + y^2 == z^2
rot xs = zipWith (++) (tails xs) (inits xs)


Die rot-Funktion kann über Applicative noch vereinfacht werden (ein nützlicher Trick, wenn man das letzte Argument mehrfach verwenden will):


import Data.List
import Control.Applicative

pythagoras :: Int -> Int -> Int -> Bool
pythagoras a b c = or $ map tripel $ rot [a,b,c] where
triple [x,y,z] = x^2 + y^2 == z^2
rot = zipWith (++) <$> tails <*> inits
Zum Seitenanfang