
Hi Bryan, I think that it isn't a very good idea to use `read/show` to do some numeric computations. You can use standard functions `div` and `mod` which work with any Integrals. digits :: (Integral a) => a -> [a] digits 0 = [] digits n = digits (n `div` 10) ++ [n `mod` 10] This code behaves differently on 0 then your one (also on negative numbers). You can fix it easily, and moreover, you may want to use `divMod` and some accumulator to improve efficiency: digits2 :: (Integral a) => a -> [a] digits2 0 = [0] digits2 n = digits2' n [] where digits2' 0 acc = acc digits2' n acc = let (r,d) = divMod n 10 in digits2' r (d:acc) I hope I understood well what you were asking about ;-) Btw, to make your code working I needed to write it as: toIntegralList :: (Read a, Integral a) => a -> [a] toIntegralList (x :: a) = map (\c -> read [c] :: a) (show x) Sincerely, Jan. On Thu, May 28, 2009 at 11:50:36AM -0400, William Gilbert wrote:
I am trying to write a function that will covert either an integer or an int into a list containing its digits.
ex. toIntegralList 123 -> [1,2,3]
I have written the following definition that tries to use read to generically cast a string value to an Integral type that is the same as the Integral passed in:
toIntegralList :: (Integral a) => a -> [a] toIntegralList x = map (\c -> read [c] :: a) (show x)
I understand it would be very simple to just create two functions, one that converts an Int and one that converts an Integer, however I was wondering if there were any way to accomplish what I am trying to do here.
Thanks In Advance, Bryan _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- Heriot-Watt University is a Scottish charity registered under charity number SC000278.