1

我期待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颠倒了数字,但我认为无论如何它应该可以工作。

4

1 回答 1

1

该片段x `div` 10 == 0不是x可被十整除的正确检查;你应该`mod`改用。此外,这个等式是不正确的:

sumDigits (x : [])    = x

(尝试,例如sumDigits [10]。)它可以被修复,但删除它更简单并且仍然正确。

于 2015-07-01T23:03:32.057 回答