我做了一些99 Haskell Problems之前的练习,我认为练习 27(“编写一个函数来枚举可能的组合”)很有趣,因为它是一个简单的概念,并且适用于多种实现。
我对相对效率很好奇,所以我决定运行几个不同的实现 - 结果在下表中。(参考:在 VirtualBox 上运行的 LXDE (Ubuntu 14.04) 中的 Emacs bash ansi-term;Thinkpad X220;8gb RAM,i5 64bit 2.4ghz。)
特尔;博士:
(i) 为什么组合生成技术 #7 和 #8(来自下表;代码包含在帖子底部)比其他技术快得多?
(ii) 另外,该Bytes栏中的数字实际上代表什么?
(i) 这很奇怪,因为函数 #7 通过过滤 powerset(比组合列表大 waaaay)来工作;我怀疑这是工作中的懒惰,即这是最有效地利用我们只要求列表长度而不是列表本身这一事实的函数。(此外,它的“内存使用率”低于其他函数,但话说回来,我不确定正在显示什么与内存相关的统计数据。)
关于功能#8:感谢Bergi 的快速实现,并感谢user5402 建议添加。仍然试图将我的领先优势围绕在这个速度差异上。
(ii)Bytes列中的数字是GHCi运行:set +s命令后上报的;它们显然不代表最大内存使用量,因为我只有 ~25gb 的 RAM + 可用 HD 空间。)?

代码:
import Data.List
--algorithms to generate combinations
--time required to compute the following: length $ 13 "abcdefghijklmnopqrstuvwxyz"
--(90.14 secs, 33598933424 bytes)
combDC1 :: (Eq a) => …Run Code Online (Sandbox Code Playgroud) TL;DR:我想要确切的行为作为filter ((== 4) . length) . subsequences. 仅使用subsequences还会创建可变长度的列表,这需要大量时间来处理。由于最终只需要长度为 4 的列表,我认为必须有一种更快的方法。
我有一个功能列表。该列表具有类型[Wor -> Wor]
列表看起来像这样
[f1, f2, f3 .. fn]
我想要的是一个n函数列表列表,同时保留这样的顺序
输入 : [f1, f2, f3 .. fn]
参数:4 个函数
输出:4 个函数的列表。
如果f1子列表中有 ,则预期输出将始终位于head列表中。
如果f2子列表中有 a而子列表没有f1,f2则位于head。如果fn在子列表中,它将在last.
一般来说,如果fx列表中有 a ,它永远不会在f(x - 1).
生成子列表时基本上保留主列表的顺序。
可以假设列表的长度总是大于给定的参数。
我刚刚开始学习 Haskell,所以我还没有尝试那么多,但到目前为止,这是我尝试过的:
使用subsequences函数生成排列并对其进行应用(filter (== 4) . length) …
是否有一个Haskell函数可以从列表中生成给定长度的所有唯一组合?
Source = [1,2,3]
uniqueCombos 2 Source = [[1,2],[1,3],[2,3]]
Run Code Online (Sandbox Code Playgroud)
我试过寻找Hoogle,但找不到具体做到这一点的功能.排列不会产生预期的结果.
以前有人用过类似的功能吗?