Я ожидаю luhn 5594589764218858 = True
но это всегда False
реализация алгоритма Лун
-- Get the last digit from a number
lastDigit :: Integer -> Integer
lastDigit 0 = 0
lastDigit n = mod n 10
-- Drop the last digit from a number
dropLastDigit :: Integer -> Integer
dropLastDigit n = div n 10
toRevDigits :: Integer -> [Integer]
toRevDigits n
| n <= 0 = []
| otherwise = lastDigit n : toRevDigits (dropLastDigit n)
-- Double every second number in a list starting on the left.
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther [] = []
doubleEveryOther (x : []) = [x]
doubleEveryOther (x : y : z) = x : (y * 2) : doubleEveryOther z
-- Calculate the sum of all the digits in every Integer.
sumDigits :: [Integer] -> Integer
sumDigits [] = 0
sumDigits (x : []) = x
sumDigits (x : y) = (lastDigit x) + (dropLastDigit x) + sumDigits y
-- Validate a credit card number using the above functions.
luhn :: Integer -> Bool
luhn n
| sumDigits (doubleEveryOther (toRevDigits n)) `div` 10 == 0 = True
| otherwise = False
Я знаю, что это можно сделать проще, но я следую Haskell introductory. Я думаю, что моя единственная проблема в функции luhn
. В курсе упоминаются проблемы, так как toRevDigits
меняет число, но я думаю, что он должен работать в любом случае.
Я бы предложил написать несколько тестов для каждого из этих компонентов (хорошая возможность изучить quickcheck, если у вас мало времени). – jberryman
@BradyDean Ваша функция 'sumDigits' неверна. Рассмотрим этот пример. 'lastDigit 123' возвращает' 3'. 'dropLastDigit 123' возвращает' 12'. Однако '3 + 12' не равно сумме цифр (' 1 + 2 + 3'). – Jubobs
Цифры разделяются. 'sumDigits [10, 5, 18, 4] = 1 + 0 + 5 + 1 + 8 + 4 = 19' - это то, что я собираюсь сделать для –