Works like a charm. Here's a final copy for those interested. Michael
===== import Data.Ratio cf2 :: Rational -> [Int] cf2 a = let ai = floor a air = toRational ai in ai : if a == air then [] else cf2 (1 / (a - air)) --- On Sun, 3/29/09, Miguel Mitrofanov <miguelim...@yandex.ru> wrote: From: Miguel Mitrofanov <miguelim...@yandex.ru> Subject: Re: [Haskell-cafe] Rational and % operator remix To: "michael rice" <nowg...@yahoo.com> Cc: "Lennart Augustsson" <lenn...@augustsson.net>, haskell-cafe@haskell.org Date: Sunday, March 29, 2009, 4:25 PM cf2 a = let ai = floor a air = toRational ai in ai : if a == air then [] else cf2 (1 / (a - air)) On 30 Mar 2009, at 00:19, michael rice wrote: > 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 <lenn...@augustsson.net> wrote: > > From: Lennart Augustsson <lenn...@augustsson.net> > Subject: Re: [Haskell-cafe] Rational and % operator remix > To: "michael rice" <nowg...@yahoo.com> > Cc: haskell-cafe@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 <nowg...@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@haskell.org > > http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe