x^y. Reply

Toralf Wittner wittner@uni-duesseldorf.de
Wed, 19 Dec 2001 16:30:41 +0100


Ahh - sorry, too much cut and paste ;-)


data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read)


pow :: PowerNum -> Integer -> PowerNum
pow x y = z x y where

	z (INT x) y = 	if y > 0 then
				INT $ powInteger x y
			else if y == 0 then
				INT $ 1 
			else
				DBL $ powDouble (fromInteger x) y
	
	z (DBL x) y =	DBL $ powDouble x y

	powInteger x y
		| x == 0	= 0
		| y == 0	= 1
		| y >  0	= x * powInteger x (y - 1)
	

	powDouble x y
		| x == 0	= 0
		| y == 0	= 1
		| y <  0	= 1 / x * powDouble x (y + 1)




Now it basically works. However wouldn't it have been easier to write  
something like this:


module Main where

import System


main = do
	[a1, a2] <- getArgs
	let x = read a1	
	let y = read a2 in
		if y >= 0 then
			putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powPos x y))
		else
			putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powNeg x y))




powPos :: Integer -> Integer -> Integer
powPos x y
	| x == 0	= 0
	| y == 0	= 1
	| y >  0	= x * powPos x (y - 1)


powNeg :: Integer -> Integer -> Double
powNeg x y
	| x == 0	= 0
	| y == 0	= 1
	| y <  0	= 1 / fromInteger x * powNeg x (y + 1)


Initially I wanted something as terse as the Python version, now I either 
have to write two functions or I need to define a type. Is there not an 
easier way to come as close as possible to the Python version?

Thanks anyway - learnt a lot!
Toralf