2016-11-27 10 views
2

В настоящее время я просматриваю книгу 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 в качестве результата.

Может ли кто-нибудь помочь мне и дать мне совет, как я мог бы это решить?

+0

И ваш 'if' выражения недействителен. Вам не хватает «другого» случая. – Carcigenicate

+0

О да, простите, я забыл. Я добавлю его сейчас! – TheCoolFrood

+3

И вы используете 'mod' как инфикс, но не имеете его завернутый в backticks, поэтому он рассматривается как аргумент. Вероятно, это ваша ошибка. – Carcigenicate

ответ

2
luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = if (((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0 then True 
  1. Вы не дали ему else после if.
  2. Вы вызываете префикс mod, а не infix `mod`.

Fix:

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 

или

luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = if (mod ((luhnDouble w) + x + (luhnDouble y) + z) 10) == 0 
        then True 
        else False 

или менее излишняя версия:

luhn :: Int -> Int -> Int -> Int -> Bool 
luhn w x y z = (mod ((luhnDouble w) + x + (luhnDouble y) + z) 10) == 0 
+0

Я добавил редактирование. Извините, если это противоречит вашим намерениям. – Carcigenicate