【发布时间】:2021-04-04 18:23:30
【问题描述】:
我想找到一个字符串的所有可能分区到一个非空字符串列表中。
例如,如果我输入"sun",
我想创建这个输出:[["s","u","n"], ["s","un"], ["su","n"], ["sun"]].
我创建了一个简单的递归函数,但它打印出这个 overflow 错误我无法修复它,我需要帮助:
partition :: String->[[String]]
partition w = [[(head w)]:fix | fix <- partition (tail w)]
++[((head w):fix):fixfix | (fix:fixfix)<-partition (tail w)]
【问题讨论】:
-
建议:试着用铅笔和纸在一个小的输入上进行评估,比如
"",看看你是否能看到你的纸上正在增长什么堆栈。 -
我认为这个真的棘手看看你什么时候不习惯懒惰和评估/强制的方式/时间 - 将你的与你前面的相同
[[head w]] :在两个列表前面..现在发生了什么? 提示:你什么时候强制head w?评估时您要做的第一件事是尝试将列表转换为_ : _形式(_是一些 thunk),对于++,您首先评估左侧 - 对于列表理解,您需要 @987654330 @first ... -
顺便说一句:如果你启用
BangPatterns(:set -XBangPatterns` in ghci) - 你会得到partition !w = ...所想象的一些东西,我想这会很快地指出你的问题 -
另外:每当你使用
head和tail时,你应该问问自己是否可以改用partition (h:tl) = ..重写它 - 遇到问题的地方更明显,而且通常更容易编写列表中的递归函数也是如此 -
@Carsten 即使经过严格的评估,这段代码也有很大的问题。
标签: list haskell combinatorics partition