项目Euler 43:我的尝试没有输出

时间:2012-03-22 16:19:29

标签: haskell

我目前正在解决在Haskell中改进的euler问题。但是,我尝试解决problem n° 43没有产生输出。

为了清楚起见,即使我错了,我也不会在“问题算法”部分寻求帮助。我特意在Haskell部分寻求帮助。

所以,我把我的尝试分成了简单的功能。首先,我构建一个包含所有0-9数字数字的列表,然后我定义函数将这些数字切割成有趣的部分,最后我只过滤正确的数字:

import Data.List
main = print $ foldl1 (+) goodOnes

pands = [read x :: Integer | x <- permutations "0123456789", head x /= '0']

cut3from :: Integer -> Integer -> Integer
cut3from x n = mod (div x nd) 1000
    where
        l = fromIntegral $ length $ show x :: Integer
        nd = 10 ^ (l - 3 - n)

cut :: Integer -> [Integer]
cut x = map (cut3from x) [1..7]

testDiv :: Integral a => [a] -> Bool
testDiv l = and zipped
    where
        zipped = zipWith mult l [2, 3, 5, 7, 11, 13, 17]

mult :: Integral a => a -> a -> Bool
mult a b = mod a b == 0

goodOnes = filter (testDiv.cut) pands

但是,在编译它(使用-O2)并执行它时,它什么都不输出。即使使用+RTS -s

我主要就两点提出建议:

  • 为什么这段代码错了,如何改进呢
  • 我怎么能自己调试呢
  • 作为一个侧面点,如果您有关于如何轻松处理Integer和Ints的建议,请发布它们。我发现同时使用它们很麻烦。

但欢迎任何其他评论!

编辑:似乎GHCi慢慢构建了结果列表goodOnes并且能够在很长一段时间后回答(仅在GHCi中,当编译时仍然如报告的那样)。这当然不是我希望在我的程序中观察的行为。我怎么能解决这个问题?

EDIT2:它现在在编译时也能正常工作(代码不变)。我对所有这些不一致感到困惑,并欢迎任何解释!

EDIT3:半开心结束:重启后,一切都恢复正常~~

1 个答案:

答案 0 :(得分:2)

回答“我怎么能自己调试”:

查看ghci。

prompt$ ghci
GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> 

这是一个交互式翻译,可以让你:

  • 加载文件并播放内容

    Prelude> :load myfile.hs 
    [1 of 1] Compiling Main             ( myfile.hs, interpreted )
    Ok, modules loaded: Main.
    *Main> xyz "abc"
    *Main> 3
    
  • 输入定义并使用它们

    *Main> let f x = x + 3
    
  • 评估表达式并查看结果

    *Main> f 14
    17
    
  • 检查类型和种类

    *Main> :t f
    f :: (Num a) => a -> a
    
    *Main> :k Maybe
    Maybe :: * -> *
    

确保在测试整个shebang之前测试每个小块 - 在小东西中找到问题比在大东西中找到问题更容易。如果您正在进行单元测试,请查看QuickCheck

对于Int s与Integer问题,您可以仅使用Integer来回避问题(当然,它们可能效率较低:YMMV)。 Data.List的函数前缀为generic,即genericLength非常有用。


以下是我编译和运行它的方法:

prompt$ ghc euler43.hs
prompt$ ./a.out
<some number is printed out>