试试这个怎么样,或者至少从中得到一些逻辑。它运作良好。它有一个辅助函数来将字符串转换成一个单独的字符列表,例如“abc”变成[“a”、“b”、“c”]。像这样处理它们并不那么复杂,并且有必要在结果列表中收集不同的字符串。函数集中有两个函数,第三个函数保证用一个参数调用主函数。主要功能在一条线上,但使用警卫。
ca = [[c] | c <- "abcdef"]
f (l1,ls) | null ls = l1++[[]] | True = f ( l1 ++ [concat ls], (tail ls))
f ([],ca)
["abcdef","bcdef","cdef","def","ef","f",""]
编辑 2018
年 4 月 4 日我错了。列表参数不必事先制作成列表。通过不这样做,通过删除 concat 函数并将参数列表从元组更改为单个删除的批次或括号,该函数变得更简单。
fs l1 ls = if null ls then l1++[""] else fs (l1++[ls]) (tail ls)
它的调用方式也不同。
fs [] “你好!”
这本身就产生了正确的结果。
编辑/添加 2018 年 4 月 11 日
不断重复出现(没有双关语)的是依赖于tail
Haskell 何时将输入拆分为 head 和 tail 并(x:xs)
准备好使用。(x:xs)
这是一个仅用于头部和尾部的基本递归函数。我生成输入列表的所有尾部,包括 null。
t [] = [""]; t (x:xs) = [x:xs] ++ t xs
还有一个将列表作为唯一参数。
t ls = [drop n ls|n<-[0..length ls - 1]]