我正在完成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
副本。