【发布时间】:2020-02-04 20:31:07
【问题描述】:
我对 Haskell 很陌生,我正在尝试解决以下问题:
我有一个函数,可以生成一个无限长的不同长度的字符串列表。但是一定长度的字符串数量是有限制的。
现在我想提取列表中具有特定长度 n 的所有子字符串。不幸的是,我做了很多研究并尝试了很多东西,但没有一个对我有用。
我知道filter() 不起作用,因为它会检查列表的每个部分并导致无限循环。
这是我生成无限列表的函数:
allStrings = [ c : s | s <- "" : allStrings, c <- ['R', 'T', 'P']]
我已经试过了:
allStrings = [x | x <- [ c : s | s <- "" : allStrings,
c <- ['R', 'T', 'P']], length x == 4]
没有终止。
感谢您的帮助!
【问题讨论】:
-
filter不会导致无限循环,因为它以惰性方式工作。只有当你完全评估列表时,它当然会陷入无限循环。 -
allStrings = [ c : s | s
-
@WillemVanOnsem 不会
print . filter (>0) $ [0..]“全面评估列表”? -
@T.Naz: 那是因为你的
allStrings永远不会发出什么东西,因为你说它应该是长度4,但是为了在这里构造一个长度为4的列表,你首先需要allStrings 来构造一个长度为3等的列表 -
@WillNess:是的,因为,如前所述,
print将完全评估该列表,因此一旦您开始printing,您将永远无法摆脱它。
标签: list haskell functional-programming infinite enumerate