Haskell循环消耗32GB的“数据”;简单的;输出
我还是一个haskell新手,所以请原谅我糟糕的代码风格 我需要把盒子里各种字母的组合写进文件里。事实上,我需要所有这些线来对一个古老的谜进行暴力攻击。一行由26个字母和10个数字组成。拼图中给出的前6个字符是字母 这是我的代码:Haskell循环消耗32GB的“数据”;简单的;输出,haskell,out-of-memory,Haskell,Out Of Memory,我还是一个haskell新手,所以请原谅我糟糕的代码风格 我需要把盒子里各种字母的组合写进文件里。事实上,我需要所有这些线来对一个古老的谜进行暴力攻击。一行由26个字母和10个数字组成。拼图中给出的前6个字符是字母 这是我的代码: import Data.List (delete) letters = ['A'..'Z'] allChars = letters ++ ['0'..'9'] boxContents :: [Char] -> [Char] -> [[Char]] bo
import Data.List (delete)
letters = ['A'..'Z']
allChars = letters ++ ['0'..'9']
boxContents :: [Char] -> [Char] -> [[Char]]
boxContents l lp = [a:b:c:d:e:f:delete f(delete e(delete d(delete c (delete b (delete a lp))))) |
a <- l,
b <- delete a l,
c <- delete b (delete a l),
d <- delete c (delete b (delete a l)),
e <- delete d (delete c (delete b (delete a l))),
f <- delete e (delete d (delete c (delete b (delete a l))))
]
main :: IO()
main = writeFile "c:\\bc.txt" $ unlines $ boxContents letters allChars
导入数据列表(删除)
字母=['A'…'Z']
allChars=字母+++['0'..'9']
boxContents::[Char]->[Char]->[[Char]]
boxContents l lp=[a:b:c:d:e:f:delete f(delete e)(delete d)(delete c)(delete b(delete a lp '))|
a您是否正在尝试生成长度为7的所有字符的排列,其中前六个已知为字母
?请使用排列
,并阅读以下内容:您是否使用-O2
编译它在ghc 7.8中没有使用-O2
的空间爆炸。4@RobAu:字符串比7个字符长一点。大一点。西比:你是我的英雄。这是一个暗示。现在它起作用了。谢谢。有人解释过为什么在没有优化的情况下,GHCi需要这么多空间吗?为什么在上面的代码中保留这么多数据?为什么它没有被垃圾收集?使用show.length
而不是unlines
使它在恒定空间中运行。E即使使用show.length.unlines
也会使其具有恒定的空间。writeFile
中的问题是否不像人们所期望的那样懒散地编写?无论优化级别如何(正如我所期望的),它都会在恒定的空间中运行。我是唯一一个吗?