Haskell中的Luhn函数

时间:2016-11-27 18:32:31

标签: haskell luhn

我目前正在阅读这本书Programming in Haskell(到目前为止绝对令人惊讶),但在练习4.8.8中遇到了问题。

任务是使用帮助函数luhnDouble :: Int -> Int在Haskell中实现 Luhn algorithm (如果结果大于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作为结果吗?

然后我尝试使用 lambda表达式

来调整函数
luhn :: Int -> (Int -> (Int -> Bool))
luhn = \w ->(\x ->(\y -> (\z -> ((luhnDouble w) + x + (luhnDouble y) + z mod 10))))

但我不确定如何在此处引入if表达式以获得Bool值。

任何人都可以帮助我,并给我一个小费如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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,而不是中缀`mod`
  3. 修正:

    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
    

答案 1 :(得分:1)

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

这将起作用