【发布时间】:2012-02-04 12:12:29
【问题描述】:
对于那些心存疑虑的人,这不是功课,只是好奇。
给定一个有限的字母表,是否有可能构造一个无限长的单词列表?
即给定字母"ab"
是否可以构造列表:
["aaaaaa...", "baaaaa...", "abaaaa...", "bbaaaa...", "aabaaa...", ...]
其中... 表示无限长的列表(和列表的列表)。
一个天真的尝试是:
counters alphabet = [c:ounter | ounter <- counters alphabet, c <- alphabet]
但这不起作用,因为它是递归的。
当然,在工作版本中,如果您尝试打印结果,您只会看到第一个元素被打印为字母表中第一个元素的无限列表。但是,您应该可以这样做:
mapM_ (print . take 2) . take 4 . counters $ "ab"
并查看输出:
aa
ba
ab
bb
【问题讨论】:
-
你知道有无数个单词,所以列表不会包括所有这些?
-
是的,但是您在问题中写了“所有无限长的单词”;这不是全部,只有从某个角度由“a”组成的那些。
-
如果您只对延伸到
aaa...的字符串感到满意,那么为什么不直接生成所有有限词并添加aaa...? -
@redxaxder 我试过了。有许多令人讨厌的特殊情况,因为序列
"", "a", "aa", "aaa", ...中的所有有限词都会产生相同的无限词。我没有同时找到一个相当优雅(少数特殊情况)和相当高效(例如不使用nub)的解决方案。 -
@redxaxder,抱歉这么慢。我将有限长度与固定长度混淆了。是的,我明白你现在在说什么。谢谢。