# Luhn Algorithm to check for validity of bank card numbers

Saturday, Dec 12, 2020

The Luhn algorithm is used to check bank card numbers for simple errors such as mistyping a digit, and proceeds as follows:

• consider each digit as a separate number;
• moving left, double every other number from the second last;
• subtract 9 from each number that is now greater than 9;
• add all the resulting numbers together;
• if the total is divisible by 10, the card is valid.

Let's see how we can implement the algorithm in Haskell for a simple case of four-digit number. We divide the problem into two steps:

1. A function luhnDouble that doubles a digit and subtracts 9 if the result is greater than 9, and
2. A function luhn that decides if a four-digit number is valid based on the above algorithm.
luhnDouble :: Int -> Int
luhnDouble n | n*2 > 9 = n*2 - 9
| otherwise = n*2

luhn :: Int -> Int -> Int -> Int -> Bool
luhn a b c d =
(luhnDouble a + b + luhnDouble c + d) mod 10 == 0


Note how the guard equation makes even a single if-then-else conditional more readable.

*Main> luhn 2 2 7 9
True
*Main> luhn 7 8 9 3
False


It would be nice to extend it to a function that accetps card numbers of any length.