在递归函数上停止条件 - Haskell

时间:2015-06-14 21:09:21

标签: string function haskell if-statement recursion

所以,我有这个功能,旨在对齐左边的文字而不切割单词(只有空格)。但是我的问题是我找不到函数的停止条件而且它无限地进行。

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),请告诉。

1 个答案:

答案 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!"