Haskell 中的 Luhn 函数

Luhn function in Haskell

我目前正在学习 Programming in Haskell 这本书(到目前为止这绝对是惊人的),但是 运行 在练习 4.8.8 中遇到了问题。

任务是在 Haskell 中实现 Luhn algorithm,使用帮助函数 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 作为结果吗?

然后我尝试柯里化函数并使用 lambda 表达式:

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

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

谁能帮帮我,告诉我如何解决这个问题?

luhn :: Int -> Int -> Int -> Int -> Bool
luhn w x y z = if (((luhnDouble w) + x + (luhnDouble y) + z) mod 10) == 0 then True
  1. 你没有在 if 之后给它一个 else
  2. 您调用的是前缀 mod,而不是中缀 `mod`

修复:

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
luhn :: Int -> Int -> Int -> Int -> Bool
luhn w x y z = (luhnDouble w + x + luhnDouble y + z) `mod` 10 == 0

这会起作用