所以,我有这个功能,旨在对齐左边的文字而不切割单词(只有空格)。但是我的问题是我找不到函数的停止条件而且它无限地进行。
f n "" = "" --weak condition
f n s = if n >= ((maximum . map length . words) s) then if (s !! n == ' ' || s !! n == '\t' || s !! n == '\n')
then take n s ++ "\n" ++ (f n ( drop n s)) else f (n-1) s
else error "Try bigger width!"
嗯,基本上,如果n小于最长的单词,那么它会提示错误,否则它会切断''''白色空格中的字符串,直到它到达非空格字符,然后它为n-1
递归调用自身。我还使用putStr
来避免" \ n"在输出中。
然而,正如我已经说过,停止条件太弱或根本不存在。如果代码中有其他流程或可能的优化(例如,少ifs),请告诉。
答案 0 :(得分:3)
您的代码不处理行短于最大长度的情况。
这有点被另一个错误所掩盖:n
递减直到找到空格,然后递归f
递归传递此递减的n
值,有效地限制所有后续行到当前行的长度。
(另外,您可能希望从n + 1
中删除s
个字符,因此原始空格不会包含在输出中。)
您可以使用模式来避免ifs:
f n "" = "" -- weak condition
f n s
| n >= (maximum . map length . words) s =
if s !! n == ' ' || s !! n == '\t' || s !! n == '\n'
then take n s ++ "\n" ++ f n (drop n s)
else f (n - 1) s
| otherwise = error "Try bigger width!"