我正在完成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 [Zero, One])

一些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


这修复了您的解码错误。

我希望我可以说我使用了超人的调试技能来发现这些错误,但是几年前我刚做完第12章时,恰好有我自己的Barcode.hs副本。

07-24 15:49