haskell - Haskell 中的 EAN13 条码编码 : How to test it?

标签 haskell testing encoding barcode decoding

我正在完成 chapter 12 of Real World Haskell .在本章中,作者解释了如何使用 EAN13 encoding 执行条码识别。 .

我从 the book snippets into my repo 复制了大部分代码当我终于到达检查我的 300 多行代码是否按预期工作时,我得到了一个坏消息:

-- Finding the Correct Sequence
*Main> let input = zip (runLengths $ encodeEAN13 "9780132114677") (cycle [Zero, One])
*Main> listToMaybe . solve . candidateDigits $ input
Just [0,2,0,1,0,0,0,0,0,0,0,0,1] -- WRONG Actual
Just [9,7,8,0,1,3,2,1,1,4,6,7,7] -- Expected

自本书出版以来,我注意到一些类型签名发生了变化,例如:

$ ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> import qualified Data.Map as M
Prelude M> :t M.lookup
M.lookup :: Ord k => k -> M.Map k a -> Maybe a
-- in the book: M.lookup :: (Ord k, Monad m) => k -> M.Map k a -> m a

我尝试在 GHCi 中重现每个示例,除了最后一个示例,我总是得到与书中相同的结果。

有人从这本书中讨论过这个主题吗?

作者并没有解释每一行代码,特别是 input 变量没有在任何地方定义 let input = zip (runLengths $ encodeEAN13 "9780132114677") (cycle [零,一])

一些 EAN13 编码的条码用于测试?

万一没人知道这本书,你能给我一些EAN13编码条码的样本吗,比如:

*Main M> encodeEAN13 "9780132114677"
"101011101100010010100111001100101000010101011011001100110110011010111001010000100010010001001010000101"

为了确保我对功能的测试是正确的?

非常感谢您

最佳答案

您的实现中有两个错误:

首先,在 encodeDigits 中,您编写了 splitAt 5,而它应该是 splitAt 6。这修复了@Brian Anderson 指出的编码错误。

其次,在 bestScores 中,您编写了:

[(distance d (scaleToOne ps), n) | d <- srl, n <- digits]

什么时候你应该写:

zip [distance d (scaleToOne ps) | d <- srl] digits

这修复了你的解码错误。

我希望我可以说我用我超人的调试技巧找到了这些错误,但我刚好有自己的 Barcode.hs 副本,那是几年前我自己完成第 12 章时的以前。

关于haskell - Haskell 中的 EAN13 条码编码 : How to test it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46825859/

相关文章:

java - 测试硬编码数据的最佳方法

testing - 如何从命令行运行 Xamarin.UITest?

java - 编码困难

javascript - 从将查询字符串转换为符号的 html 字符串中删除脚本元素

algorithm - 有没有一种方法可以接收有关执行顺序的信息(特别是用于eratosthenes筛子)?

haskell - 如何为 sum 类型编写镜头

string - Haskell 按第一个空格分隔单词

haskell - 如何在 Haskell 中将函数映射到另一个函数的参数上?

.net - 如何:生成UnhandledException?

oracle - 为 Oracle 选择 NLS_LANG