What about trying this or at least get some logic from it. It works well.
It's got a helper function to convert the string into a list of separate characters, for example "abc" becomes ["a","b","c"]. It is just less complicated to process them like that and it becomes necessary to collect distinct strings in the result list. There are two functions in the function set and a third is warranted to call the primary function with one parameter. The primary function is on one line but uses guards.
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",""]
Edit 4/4/2018
I was wrong. The list parameter does not have to be made into a list before hand. By not doing so, the function becomes simpler by removing the concat function and changing the parameter list from tuple to individual removed lots or parentheses.
fs l1 ls = if null ls then l1++[""] else fs (l1++[ls]) (tail ls)
It is invoked differently, too.
fs [] "Hello!"
This, by itself, produced the right results.
Edit/add 4/11/2018
What keeps recurring (no pun) is dependence on tail
when Haskell splits up input into head and tail with (x:xs)
they are ready to use. Here is a basic recursive function that uses (x:xs)
only for head and tail. I produces all tails of input list including null.
t [] = [""]; t (x:xs) = [x:xs] ++ t xs
And yet another that takes a list as the only parameter.
t ls = [drop n ls|n<-[0..length ls - 1]]