在Haskell中生成下一个词典字符串

Ros*_*nal 6 string algorithm combinations haskell

如果给我一个字符串skhfbvqa,我将如何生成下一个字符串?对于这个例子,它将是skhfbvqb,并且下一个字符串将是skhfbvqc,依此类推.给定的字符串(和答案)总是N个字符长(在这种情况下,N = 8).

我尝试了什么:

我试图生成可能组合的整个(无限)列表,并获得给定字符串的必需(下一个)字符串,但不出所料,它太慢了,我甚至得不到N = 6的答案.

我使用了列表理解:

allStrings = [ c : s | s <- "" : allStrings, c <- ['a'..'z'] ]

main = do
    input <- readFile "k.in"
    putStrLn . head . tail . dropWhile (not . (==) input) . map reverse $ allStrings
Run Code Online (Sandbox Code Playgroud)

(请原谅我非常糟糕的Haskell-ing :)还是一个菜鸟)

所以我的问题是,我该怎么做?如果有多种方法,我们非常感谢它们之间的比较.谢谢!

eps*_*lbe 1

我会去创建一个辅助函数f :: Integer -> String和一个g :: String -> Integer,where f 1 = "a",... f 27 = "aa"f 28 = "ab"等等以及相反的函数g

然后incrementString = f . succ . g

f注:为了学习,我故意省略了实现

更新

对于不同的方法,您可以使用进位函数定义增量inc' :: Char -> (Char, Bool),然后

incString :: String -> String
incString = reverse . incString'
   where incString' [] = []
         incString' (x:xs) = case inc' x of (x',True) -> x': incString' xs
                                            (x',False) -> x':xs
Run Code Online (Sandbox Code Playgroud)

注意:这个函数不是尾递归!