我想创建一个Haskell函数,该函数显示列表的后缀:
该函数应执行以下操作:
> suffixes "123"
["23","3",""]
> suffixes "1"
[""]
我写了以下代码:
suffixes :: [a] -> [[a]]
suffixes [] = [] : []
suffixes f@(_:t) = f: suffixes t
该函数将输入的字符串或字符作为后缀打印出来,我想将其删除,因此当我输入“ 123”时,它应该按上述方式打印。
您能帮我解决这个问题,以便它不打印输入的字符串作为后缀吗。
答案 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",""]