[Haskell-beginners] Couldn't match expected type `(a0 -> [a0]) -> [a0]', with actual type `[a0]'

Mike Meyer mwm at mired.org
Sat May 23 12:45:56 UTC 2015


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 at 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.
>
> [1]: https://www.cs.nott.ac.uk/~gmh/fold.pdf
>
> On 23 May 2015 at 12:28, Roelof Wobben <r.wobben at 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 at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>
>
>
> --
> Regards
>
> Sumit Sahrawat
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20150523/877c84d8/attachment.html>


More information about the Beginners mailing list