3

我想创建一个打印列表后缀的 Haskell 函数:

该函数应执行以下操作:

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

我写了以下代码:

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

该函数将输入的字符串或字符打印为后缀,我想将其删除,因此当我输入“123”时,它应该如上所示打印。

你能帮我解决这个问题,这样它就不会将输入的字符串打印为后缀。

4

1 回答 1

4

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

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

这是有效的,因为它是列表t尾部,所以它是列表,但没有第一个元素。因此,我们产生了这个元素,并对尾部执行递归t,直到我们到达空列表。由于这个空列表已经被递归案例“产生”,因此我们不会在基本案例中产生它。

或者我们可以只保留旧suffixes函数(但将其重命名为 example go),并让外部函数通过“弹出”一个元素来“预处理”列表:

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",""]
于 2018-10-07T19:46:03.233 回答