[Haskell-cafe] Rational and % operator remix

michael rice nowgate at yahoo.com
Sun Mar 29 16:19:52 EDT 2009


I'm a Lisper, kind of feeling my way around here in Haskell, so please bear with me.

I did the things you suggested, but I think the last one may have gotten garbled. Anyway, this is what I ended up with

cf2 :: Rational -> [Int]
cf2 a = let ai = floor a
            in
              if a == (toRational ai)
                then [ai]
                else ai : cf2 (1 / (a - ai))

but I'm still at least one error short of a clean run

Main> :load cf.hs
ERROR "cf.hs":7 - Type error in application
*** Expression     : ai : cf2 (1 / (a - ai))
*** Term           : ai
*** Type           : Ratio Integer
*** Does not match : Int


Where did I go wrong or what did I leave out?

Michael


--- On Sun, 3/29/09, Lennart Augustsson <lennart at augustsson.net> wrote:

From: Lennart Augustsson <lennart at augustsson.net>
Subject: Re: [Haskell-cafe] Rational and % operator remix
To: "michael rice" <nowgate at yahoo.com>
Cc: haskell-cafe at haskell.org
Date: Sunday, March 29, 2009, 2:29 PM

You can use floor in a Rational directly, no need to take it apart and divide.

There is no need to write (toRational 1), just write 1.

Don't write (subtract ai a), write (ai - i).

You also have a type error; the ai should no be a Rational, so you
need to move to toRational call to the comparison.

  -- Lennart

2009/3/29 michael rice <nowgate at yahoo.com>:
> 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, 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. 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))
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>



      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090329/156dc540/attachment.htm


More information about the Haskell-Cafe mailing list