[Haskell-cafe] Rational and % operator remix
Daniel Fischer
daniel.is.fischer at web.de
Sun Mar 29 14:35:33 EDT 2009
Am Sonntag 29 März 2009 19:40:19 schrieb michael rice:
> Hi,
>
> Thanks again for the help last night.
>
> The second function cf2 is an attempt to reverse the process of the
first
> function, i.e., given a rational number it returns a list of integers,
> possibly infinite,
Not for rational numbers.
> but you shouldn't get into trouble if you use 98%67 as
> input (output should be [1,2,6,5]). The interpreter is complaining
about
> the '=' following the 'in' keyword.
That should be '=='.
> Is there a better way to state this?
>
> Michael
>
> import Data.Ratio
> cf :: [Int] -> Rational
> cf (x:[]) = toRational x
> cf (x:xs) = toRational x + 1 / cf xs
>
> cf2 :: Rational -> [Int]
> cf2 a = let ai = toRational (floor ((numerator a) / (denominator a)))
> in
> if a = ai
> then [a]
> else ai : cf2 ((toRational 1) / (subtract ai a))
import Data.List (unfoldr)
cf3 :: Rational -> [Integer] -- Int may overflow
cf3 0 = [0]
cf3 x = a0:unfoldr f r
where
a0 = floor x
r = x - fromInteger a0
f 0 = Nothing
f y = Just (properFraction $ recip y)
More information about the Haskell-Cafe
mailing list