首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中的Luhn函数

Haskell中的Luhn函数
EN

Stack Overflow用户
提问于 2016-11-27 18:32:30
回答 2查看 824关注 0票数 3

我目前正在阅读“Haskell程序设计”一书(到目前为止,这本书绝对令人惊讶),但在练习4.8.8中遇到了一个问题。

任务是在Haskell中实现https://en.wikipedia.org/wiki/Luhn_algorithm,使用帮助函数luhnDouble :: Int -> Int (如果结果大于9,它将数字加倍并减去9)和mod函数。

实现luhnDouble函数没有问题,但我很难将这两个函数都转换为Int -> Int -> Int -> Int -> Bool类型的函数。

我试过两种方法:

代码语言:javascript
复制
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

我收到一个类型错误。

代码语言:javascript
复制
* 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

但是,我不是将函数4Int作为参数并因此获得一个Bool吗?

然后,我尝试运行函数并使用lambda表达式。

代码语言:javascript
复制
luhn :: Int -> (Int -> (Int -> Bool))
luhn = \w ->(\x ->(\y -> (\z -> ((luhnDouble w) + x + (luhnDouble y) + z mod 10))))

但是,我不知道如何在这里引入if表达式,从而得到一个Bool值。

有人能帮我一下吗,告诉我怎么解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-27 18:41:51

代码语言:javascript
复制
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`

修正:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

或者,减少一些冗余的版本:

代码语言:javascript
复制
luhn :: Int -> Int -> Int -> Int -> Bool
luhn w x y z = (mod ((luhnDouble w) + x + (luhnDouble y) + z) 10) == 0
票数 3
EN

Stack Overflow用户

发布于 2020-02-13 00:58:16

代码语言:javascript
复制
luhn :: Int -> Int -> Int -> Int -> Bool
luhn w x y z = (luhnDouble w + x + luhnDouble y + z) `mod` 10 == 0

这会起作用的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40832422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档