Haskell 拥抱置换足够的空间
首先,是的,我知道我应该使用ghc来代替(但我们在课程中被迫使用拥抱) 因此,我尝试生成Haskell 拥抱置换足够的空间,haskell,hugs,Haskell,Hugs,首先,是的,我知道我应该使用ghc来代替(但我们在课程中被迫使用拥抱) 因此,我尝试生成[1..9]的所有排列,但在计算时,hugs抛出了一个错误: “错误-垃圾收集无法回收足够的空间” 是否有任何快速修复或迂回解决方法?问题可能不是因为拥抱,而是因为排列函数的编写方式防止了垃圾收集,或者只是分配了太多内存 以下排列的定义适用于GHC和Hugs中的[1..9](尽管Hugs中的排列[1..9]要求在我的计算机上惊人地调用垃圾收集器58次) 问题很可能不是因为拥抱,而是因为排列函数的编写方式防止了
[1..9]
的所有排列,但在计算时,hugs抛出了一个错误:
“错误-垃圾收集无法回收足够的空间”
是否有任何快速修复或迂回解决方法?问题可能不是因为拥抱,而是因为排列函数的编写方式防止了垃圾收集,或者只是分配了太多内存 以下排列的定义适用于GHC和Hugs中的
[1..9]
(尽管Hugs中的排列[1..9]
要求在我的计算机上惊人地调用垃圾收集器58次)
问题很可能不是因为拥抱,而是因为排列函数的编写方式防止了垃圾收集,或者只是分配了太多内存 以下排列的定义适用于GHC和Hugs中的
[1..9]
(尽管Hugs中的排列[1..9]
要求在我的计算机上惊人地调用垃圾收集器58次)
您是如何定义置换函数的?如果不了解您是如何实现置换生成器的,我们如何帮助您?编写此类函数时需要记住的一点是,预结束基本上总是比追加好。如果您有一些列表
xs
,那么1:xs
和2:xs
将共享xs
,而xs++[1]
和xs++[2]
每个人都将制作自己的副本。您是如何定义置换函数的?我们如何帮助您,而不看您是如何实现置换生成器的?编写此类函数时要记住的一点是,预结束基本上总是优于附加。如果您有一些列表xs
,那么1:xs
和2:xs
将共享xs
,而xs++[1]
和xs++[2]
将各自复制它。只要工作集保持较小,经常调用垃圾收集器并不是什么大问题,如果我的粗略分析是正确的,那么那里的工作集应该保持在列表长度的倍数以内。只要工作集保持较小,那么经常调用垃圾收集器并不是什么大问题,如果我的粗略分析是正确的,那么那里的工作集应该保持在列表长度的倍数以内。
permutations :: [a] -> [[a]]
permutations [] = [[]]
permutations (x:xs) = concatMap insertEverywhere (permutations xs)
where insertEverywhere [] = [[x]]
insertEverywhere (y:ys) = (x:y:ys): (map (y:) $ insertEverywhere ys)