Nope they don't! Lists and arrays are conceptionally very different!
An array is a fixed block of memory where the single elements are lined up in order, you have constant time access here, but changing the size requires you to completely reallocate the memory and copy old content over.
A list on the other hand side is dynamic sized, this is bought by a larger memory footprint per element (pointer to the next one is added) and higher time for random access.
You are right. Im was confusing it because several languages uses these words differencely.
Roelof
Norbert Melzer schreef op 7-2-2015 om 11:41:
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
_______________________________________________ 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