Haskell 拥抱置换足够的空间

Haskell 拥抱置换足够的空间,haskell,hugs,Haskell,Hugs,首先,是的,我知道我应该使用ghc来代替(但我们在课程中被迫使用拥抱) 因此,我尝试生成[1..9]的所有排列,但在计算时,hugs抛出了一个错误: “错误-垃圾收集无法回收足够的空间” 是否有任何快速修复或迂回解决方法?问题可能不是因为拥抱,而是因为排列函数的编写方式防止了垃圾收集,或者只是分配了太多内存 以下排列的定义适用于GHC和Hugs中的[1..9](尽管Hugs中的排列[1..9]要求在我的计算机上惊人地调用垃圾收集器58次) 问题很可能不是因为拥抱,而是因为排列函数的编写方式防止了

首先,是的,我知道我应该使用ghc来代替(但我们在课程中被迫使用拥抱)

因此,我尝试生成
[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)