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@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@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@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@haskell.org
http://www.haskell.org/mailman/listinfo/beginners


_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners