В настоящее время я просматриваю книгу Programming in Haskell (что совершенно неудивительно), но столкнулся с проблемой в упражнении 4.8.8.Luhn function in Haskell
Задача состоит в том, чтобы реализовать Luhn algorithm в Haskell, используя функцию помощи luhnDouble :: Int -> Int
(которая удваивает цифры и вычитает 9, если результат больше 9) и mod
несильно.
Реализация функции luhnDouble
не была проблемой, но я изо всех сил пытаюсь привести их обоих в функцию типа Int -> Int -> Int -> Int -> Bool
.
Я попытался сделать это двумя способами:
luhn :: Int -> Int -> Int -> Int -> Bool
luhn w x y z = if (((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0 then True
else False
я получаю ошибку типа.
* Couldn't match expected type `(Integer -> Integer -> Integer)
-> Integer -> Integer'
with actual type `Int'
* The function `(luhnDouble w) + x + (luhnDouble y) + z'
is applied to two arguments,
but its type `Int' has none
In the first argument of `(==)', namely
`(((luhnDouble w) + x + (luhnDouble y) + z) mod 10)'
In the expression:
(((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0
Но я не даю функцию 4 Int
ым в качестве аргументов и получения Bool
в результате?
Затем я попытался выделки функцию и используя лямбда-выражения:
luhn :: Int -> (Int -> (Int -> Bool))
luhn = \w ->(\x ->(\y -> (\z -> ((luhnDouble w) + x + (luhnDouble y) + z mod 10))))
Но я не знаю, как принести в выражении if
здесь, чтобы получить значение Bool
в качестве результата.
Может ли кто-нибудь помочь мне и дать мне совет, как я мог бы это решить?
И ваш 'if' выражения недействителен. Вам не хватает «другого» случая. – Carcigenicate
О да, простите, я забыл. Я добавлю его сейчас! – TheCoolFrood
И вы используете 'mod' как инфикс, но не имеете его завернутый в backticks, поэтому он рассматривается как аргумент. Вероятно, это ваша ошибка. – Carcigenicate