
William Gilbert
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.
Of course you can use read and show for that, but personally I find it more appropriate to write the algorithm yourself. It will be faster and give you a much more useful digit ordering, namely starting with the least significant digit: toDigits :: Integral i => i -> i -> [i] toDigits base = takeWhile (>0) . map (`rem` base) . iterate (`div` base) toDecimalDigits :: Integral i => i -> [i] toDecimalDigits = toDigits 10 fromDigits :: Num a => a -> [a] -> a fromDigits base = foldr (\d c -> base*c + d) 0 fromDecimalDigits :: Num a => [a] -> a fromDecimalDigits = fromDigits 10 Greets, Ertugrul. -- nightmare = unsafePerformIO (getWrongWife >>= sex) http://blog.ertes.de/