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
- 你没有在
if
之后给它一个 else
。
- 您调用的是前缀
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
这会起作用
我目前正在学习 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
- 你没有在
if
之后给它一个else
。 - 您调用的是前缀
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
这会起作用