【问题标题】:ISBN-13 digit check using Haskell使用 Haskell 进行 ISBN-13 位校验
【发布时间】:2020-03-01 22:22:36
【问题描述】:

我刚开始使用 Haskell 进行函数式编程,我想编写一个简短的函数来检查 13 位代码并检查它是否是 ISBN 号。

检查公式为:

x13 = (10 − ((x1 + 3x2 +x3 + 3x4 +x5 + 3x6 +x7 + 3x8 +x9 + 3x10 +x11 + 3x12)%10))%10

x1 是第一位,x2 第二位,...,x13 最后一位等等)

我希望输入是一个列表,这样对我来说更容易(13 个整数,每个 0-9)。

所以是这样的(下面的东西被简化了):

isValid :: [Int] -> Bool
--isValid = True if (lastdigit = formula)    -- can this be done in one (long) line?

所以,例如:

 isValid [ 9, 7, 8, 0, 1, 3, 7, 0, 5, 3, 4, 6, 9 ]

应该返回True

我已经尝试这样做了几个小时,但我在 Haskell 方面还不够好,这让我感到困惑。有人可以指出我正确的方向吗?我对 Haskell 了解不多,这是主要问题。

【问题讨论】:

    标签: list haskell boolean isbn


    【解决方案1】:

    您可以只对 13 个元素的列表进行模式匹配,例如:

    isValid :: [Int] -> Bool
    isValid [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13] = …
    isValid _ = False

    是您仍需要填写的部分。提示:您可以使用 mod :: Integral a => a -> a -> a 计算模数(在某些编程语言中使用 % 完成)。

    因此x13 是您可以在支票中使用的最后一个数字。

    【讨论】:

    • 嗨,你能帮我吗,我正在尝试做类似isValid [x1, x2, x3] | (x3 = x1 + x2) = True 的事情,但不确定正确的语法是什么?例如。 isValid [x1, x2, x3] | x3 &gt; x1 + x2 = True 语法正确,但我需要检查 x3 是否相等,而不是 > 或 <.>
    • @Mandingo:你用==检查相等,所以1 == 1True1 == 2False
    • 谢谢,我现在明白了,解决了我的问题。有没有更快的方法来编写代码?假设是否有比 13 多得多的数字?如果是这样,那会是更好的方法吗?
    • @Mandingo:通常如果有模式,你可以使用递归来遍历列表,或者使用zipWith等函数为你做递归。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多