Try this:

toDigits' :: Integral a => [a] -> a -> [a]
toDigits' acc 0 = acc
toDigits' acc n = toDigits' (n `mod` 10 : acc) (n `div` 10)

If the accumulator in a recursive function doesn't accumulate anything during some recursive call, but is just passed on unchanged, then  you might as well make it a free variable. Or eliminate it entirely if it's unused.

You can now use a functional programming idiom, and assign the function toDigits to the function toDigits' [], like so:

toDigits :: Integral a => a -> [a]
toDigits = toDigits' []

On Sat, May 23, 2015 at 6:59 AM, Sumit Sahrawat, Maths & Computing, IIT (BHU) <sumit.sahrawat.apm13@iitbhu.ac.in> wrote:
The error lies here:

toDigits' acc number = ((number `mod` 10 ): acc) (toDigits' (number `mod` 10))

It should instead be

toDigits' acc number = (number `mod` 10) : (toDigits' acc (number `mod` 10))

My suggestion would be to look at it like a fold.

toDigits' :: Integral a => a -> a -> [a]
toDigits' acc 0 = [acc]
toDigits' acc n = n `mod` 10 : toDigits' acc (n `div` 10)

Now this gives the digits in the reverse order, so in toDigits, you can reverse it.

A good exercise would now be to re-write this as a fold. Graham Hutton has a good paper about it. [1]

The best way would be to directly convert the number to a string using show, but that's not the point of the exercise.


On 23 May 2015 at 12:28, Roelof Wobben <r.wobben@home.nl> wrote:
Hello,

For some reasons my file's are corrupted.
I had repair them with success except this one.

Here is the code :

toDigits  number
  | number <= 0   = []
  | otherwise     = toDigits' [] number
  where
    toDigits' acc 0  = acc
    toDigits' acc number   = ((number `mod` 10 ): acc) (toDigits' (number `mod` 10))

main = print $ toDigits 123


and here is the error:

Couldn't match expected type `(a0 -> [a0]) -> [a0]'
                with actual type `[a0]'
    The function `(number `mod` 10) : acc' is applied to one argument,
    but its type `[a0]' has none
    In the expression:
      ((number `mod` 10) : acc) (toDigits' (number `mod` 10))
    In an equation for toDigits':
        toDigits' acc number
          = ((number `mod` 10) : acc) (toDigits' (number `mod` 10))


Roelof


---
Dit e-mailbericht is gecontroleerd op virussen met Avast antivirussoftware.
http://www.avast.com

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



--
Regards

Sumit Sahrawat

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners