我复制了 (http://www.haskell.org/haskellwiki/Euler_problems/11_to_20#Problem_11)给出的Euler.11解决方案,但它失败并出现索引错误:“(Array。!):undefined array element”。 当然,首先我想要一个更好的错误消息(!),甚至可能会提供失败的索引,但如果失败,我尝试调试它。调试列表理解
的数据被输入正确,并且它的一个打印示出右界限,和数据。
所以我增加了一些跟踪消息,这两个结果的表达和理解的身体。我从最终表达式中得到很多跟踪结果,但没有一个来自身体计算。为什么?
prods :: Array (Int, Int) Int -> [Int]
-- trace ("xs: " ++ show xs) (product xs)
prods a = [trace ("xs: " ++ show xs) (product xs) | i <- range $ bounds a,
s <- senses,
let trace1 = check "i: " i,
let is = take 4 $ iterate s i,
let trace2 = check "is: " is,
all (inArray a) is,
let xs = map (a!) is]
-- Doit
-- euler = print . maximum . prods . input =<< getContents
euler eData = maximum . prods $ input eData
-- Debugging tracecheck :: String -> a -> a
check msg v | trace (msg ++ (show v)) True = v
非常感谢所有观点;似乎很明显(现在!)。我在构建完数组后打印了这个数组,它看起来都很好,并且具有预期的边界。我会多花些时间看看它是如何得到一些未定义的值。 – guthrie
你对数据的错误设置是正确的 - 我错误地解释了错误信息。 – guthrie