Проверка номера ISBN-13 с использованием Haskell - PullRequest
1 голос
/ 05 ноября 2019

Я только начал функциональное программирование, используя Haskell, и я хочу написать короткую функцию, которая проверяет 13-значный код и проверяет, является ли он номером ISBN.

Формула для проверки:

x13 = (10 − ((x1 + 3x2 +x3 + 3x4 +x5 + 3x6 +x7 + 3x8 +x9 + 3x10 +x11 + 3x12)%10))%10

(x1 - первая цифра, x2 вторая, ..., x13 последняя цифра и т. Д.)

Я хочу, чтобы вход был спискомтак мне проще (13 целых чисел, каждое 0-9).

Так что-то вроде этого (вещи ниже упрощены):

isValid :: [Int] -> Bool
--isValid = True if (lastdigit = formula)    -- can this be done in one (long) line?

Итак, например:

 isValid [ 9, 7, 8, 0, 1, 3, 7, 0, 5, 3, 4, 6, 9 ]

должен вернуться True

Я пытался сделать это в течение нескольких часов, но я еще не достаточно хорош в Хаскеле, и это меня смущает. Может ли кто-нибудь указать мне правильное направление? Я не знаю много о Haskell, который является главной проблемой.

1 Ответ

4 голосов
/ 05 ноября 2019

Вы можете просто сопоставить шаблон в списке из 13 элементов, например:

isValid :: [Int] -> Bool
isValid [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13] = …
isValid _ = False

с … частью, которую вам все еще нужно заполнить. Подсказка: вы можете использовать mod :: Integral a => a -> a -> a для вычисления по модулю (в некоторых языках программирования это делается с помощью %).

Здесь x13, таким образом, является последней цифрой, которую вы можете использовать в чеке.

...