String 递归函数的停止条件-Haskell

String 递归函数的停止条件-Haskell,string,function,haskell,if-statement,recursion,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')

因此,我有一个函数,它的目的是在不剪切单词(只有空格)的情况下对齐左侧的文本。然而,我的问题是,我找不到函数的停止条件,它会无限延伸

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较少),请告知。

您的代码不处理行短于最大长度的情况

这在某种程度上被另一个bug所掩盖:
n
递减,直到找到空白,然后递归调用
f
,传递该递减值
n
,有效地将所有后续行限制为当前行的长度

(另外,您可能希望从
s
中删除
n+1
个字符,以便原始空白不包含在输出中。)

您可以通过使用模式来避免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!"

您的代码不处理行短于最大长度的情况

这在某种程度上被另一个bug所掩盖:
n
递减,直到找到空白,然后递归调用
f
,传递该递减值
n
,有效地将所有后续行限制为当前行的长度

(另外,您可能希望从
s
中删除
n+1
个字符,以便原始空白不包含在输出中。)

您可以通过使用模式来避免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!"

您的代码不处理行短于最大长度的情况

这在某种程度上被另一个bug所掩盖:
n
递减,直到找到空白,然后递归调用
f
,传递该递减值
n
,有效地将所有后续行限制为当前行的长度

(另外,您可能希望从
s
中删除
n+1
个字符,以便原始空白不包含在输出中。)

您可以通过使用模式来避免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!"

您的代码不处理行短于最大长度的情况

这在某种程度上被另一个bug所掩盖:
n
递减,直到找到空白,然后递归调用
f
,传递该递减值
n
,有效地将所有后续行限制为当前行的长度

(另外,您可能希望从
s
中删除
n+1
个字符,以便原始空白不包含在输出中。)

您可以通过使用模式来避免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!"

如何解决递归中使用的n的递减值的问题如何解决递归中使用的n的递减值的问题如何解决递归中使用的n的递减值的问题如何解决递归中使用的n的递减值的问题如何解决递归中使用的n的递减值的问题