我目前正在阅读这本书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
值。
任何人都可以帮助我,并给我一个小费如何解决这个问题?
答案 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
else
之后没有给它if
。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
答案 1 :(得分:1)
luhn :: Int -> Int -> Int -> Int -> Bool
luhn w x y z = (luhnDouble w + x + luhnDouble y + z) `mod` 10 == 0
这将起作用