我目前正在解决在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
。
我主要就两点提出建议:
但欢迎任何其他评论!
编辑:似乎GHCi慢慢构建了结果列表goodOnes并且能够在很长一段时间后回答(仅在GHCi中,当编译时仍然如报告的那样)。这当然不是我希望在我的程序中观察的行为。我怎么能解决这个问题?EDIT2:它现在在编译时也能正常工作(代码不变)。我对所有这些不一致感到困惑,并欢迎任何解释!
EDIT3:半开心结束:重启后,一切都恢复正常~~
答案 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>