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

```