x^y

Till Doerges till@doerges.net
Wed, 19 Dec 2001 10:13:45 +0100


On Tue, Dec 18, 2001 at 05:43:33PM +0100, Toralf Wittner wrote:

> power x y
> 	| x == 0	= 0
> 	| y == 0	= 1
> 	| y > 0		= x * power x (y-1)
> 	| y < 0		= 1 / fromInteger x * power x (y+1)

Why did you put 'fromInteger' into the last line? If you get rid of
that, this will make your 'power' be accepted by the haskell-compiler
or -interpreter.

> One recognizes that the function returns either an integer value if y > 0 or 
> a float value if y < 0. Therefore I can't write a signature like 
> pow :: Integer -> Integer -> Integer nor can I do 
> pow :: Integer -> Integer -> Double.

No, you can't, and that's one of the reasons why type-classes where
introduced. You don't have to state the type of x and y
explicitely. Rather you can specify certain 'properties', i.e. y must
be a number, there must be an ordering relation and x must allow for the
representation of fractions.

--- snip ---
Main> :t power
power :: (Num a, Ord a, Fractional b) => b -> a -> b
Main>  power 2 3
8.0
(113 reductions, 147 cells)
Main>  power 2 (-1)
0.5
(70 reductions, 87 cells)
Main>
--- snap ---

> How then would I write this function in Haskell (concerning types)?

See above (the type signature was kindly provided by hugs ;-).

HTH -- Till
-- 
     e-mail: reverse(net dot doerges at till)   | ENCRYPTED |
    pgp/gpg: keys via keyserver or my homepage  |  MAIL IS  |
        www: http://www.doerges.net             |  WELCOME! |