Haskell中正确的后缀

时间:2018-10-07 19:42:07

标签: haskell suffix

我想创建一个Haskell函数,该函数显示列表的后缀:

该函数应执行以下操作:

> suffixes "123"
["23","3",""]
> suffixes "1"
[""]

我写了以下代码:

suffixes :: [a] -> [[a]]
suffixes []         = [] : []
suffixes f@(_:t) = f: suffixes t 

该函数将输入的字符串或字符作为后缀打印出来,我想将其删除,因此当我输入“ 123”时,它应该按上述方式打印。

您能帮我解决这个问题,以便它不打印输入的字符串作为后缀吗。

1 个答案:

答案 0 :(得分:4)

基本上有两种方法可以做到这一点。第一种方法稍微改变了函数的工作方式:在这种情况下,基本情况返回一个空列表,而递归情况产生t而不是f

suffixes :: [a] -> [[a]]
suffixes [] = []
suffixes (_:t) = t : suffixes t

这是可行的,因为t是列表的 tail ,因此它是列表,但没有第一个元素。因此,我们产生此元素,并对尾t进行递归,直到到达空列表。由于此空列表已经被递归情况“屈服”,因此我们没有在基本情况下屈服。

或者我们可以保留旧的suffixes函数(但将其重命名为go),然后让外部函数通过“弹出”元素来“预处理”列表:< / p>

suffixes :: [a] -> [[a]]
suffixes [] = []
suffixes (_:xs) = go xs
    where go [] = [] : []
          go f@(_:t) = f: go t

请注意,对于空字符串,没有没有后缀,因此我们返回一个空列表。

这将产生预期的结果:

Prelude> suffixes ""
[]
Prelude> suffixes "a"
[""]
Prelude> suffixes "ab"
["b",""]
Prelude> suffixes "abc"
["bc","c",""]
Prelude> suffixes "123abc"
["23abc","3abc","abc","bc","c",""]