[Haskell-beginners] any feedback on this solution

Norbert Melzer timmelzer at gmail.com
Sat Feb 7 10:41:11 UTC 2015


I'm sure you don't mean array here, but a list! The difference is crucial!
Am 07.02.2015 11:01 schrieb "Roelof Wobben" <r.wobben at home.nl>:

> Why,
>
> They have opposite terms.
>
> SumDigits takes a array and has a integer as output.
> ToDigits takes a integer and puts  out a array.
>
> Roelof
>
>
> Kees Bleijenberg schreef op 7-2-2015 om 10:56:
>
>> Roelof,
>>
>> Maybe it's better to reuse toDigits in sumDigits.
>>
>> Kees
>>
>> -----Oorspronkelijk bericht-----
>> Van: Beginners [mailto:beginners-bounces at haskell.org] Namens Roelof
>> Wobben
>> Verzonden: zaterdag 7 februari 2015 10:37
>> Aan: The Haskell-Beginners Mailing List - Discussion of primarily
>> beginner-level topics related to Haskell
>> Onderwerp: [Haskell-beginners] any feedback on this solution
>>
>> Hello,
>>
>> I finally solved exercise 1 where I had to write a programm which checks
>> if a creditcard number is valid.
>>
>> I solved it this way :
>>
>> toDigits :: Integer -> [Integer]
>> toDigits n
>>      | n < 0 = []
>>      | n < 10 = [n]
>>      | otherwise =  toDigits (n `div` 10) ++ [n `mod` 10]
>>
>> -- | convert a number to a reversed array where a negative number will
>> be a empty array
>> toDigitsRev :: Integer -> [Integer]
>> toDigitsRev 0 = [0]
>> toDigitsRev n
>>      | n < 0 = []
>>      | n < 10 = [n]
>>      | otherwise = n `mod` 10 : toDigitsRev (n `div` 10)
>>
>>    -- | Doubles every second number from the right.
>> doubleEveryOther :: [Integer] -> [Integer]
>> doubleEveryOther []         = []
>> doubleEveryOther (x:[])     = [x]
>> doubleEveryOther (x:(y:zs))
>>      | length (x:(y:zs)) `mod` 2 /= 0 = [x] ++ (y * 2) : doubleEveryOther
>> zs
>>      | otherwise = [x *2]  ++ y : doubleEveryOther zs
>>
>>
>> -- | sum all the digits of a array
>> sumDigits :: [Integer] -> Integer
>> sumDigits []  = 0
>> sumDigits (x:zs)
>>      | x < 10     = x + sumDigits zs
>>      | otherwise  = x `mod` 10 + x `div` 10 + sumDigits zs
>>
>>
>> -- | validate a number by looking if a number can be divided by 10
>> validate :: Integer -> Bool
>> validate n = sumDigits(doubleEveryOther(toDigits(n))) `mod` 10 == 0
>>
>>
>> -- | The main entry point.
>> main :: IO ()
>> main = do
>>       print $ validate  4012888888881881
>>
>> Any remarks about this solution.
>>
>> I know there are higher function solutions but that part is not
>> descrived in chapter 1 .
>>
>> Roelof
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>>
>> -----
>> No virus found in this message.
>> Checked by AVG - www.avg.com
>> Version: 2015.0.5646 / Virus Database: 4281/9071 - Release Date: 02/07/15
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20150207/be863a4c/attachment.html>


More information about the Beginners mailing list