haskell - 获取haskell中字符串的所有旋转

所以我正在尝试制作一个函数“rot”,它接受一个字符串并返回一个包含所有可能旋转的字符串列表,例如 rot“abc”返回 [“abc”,“bca”,cab“],似乎用其他语言做起来非常简单,但我是 haskell 的新手,所以我想不出办法。这就是我目前所拥有的:

rot :: [Char] -> [[Char]]
rot word = 
    let
        lst = [tail word ++ [head word]]
    in
        lst
    

main = do
    print(rot "abc")

它按预期返回“bca”,但我想要找到所有旋转并将其存储在列表中的方法。

这是一个python的例子

def rot(word):
    lst = []
    for i in range(len(word)):
        newWord1 = word[0:i]
        newWord2 = word[i:]
        newWordResult = newWord2 + newWord1
        lst.append(newWordResult)
    return lst

最佳答案

好吧,您或多或少可以直接翻译您的 Python 代码。在函数式编程中习惯使用递归代替迭代,并且从length word 向下计数到零更方便。除此之外,它几乎是一样的:

rot word =
  let loop 0 lst = lst
      loop i lst =
        let newWord1 = take (i-1) word
            newWord2 = drop (i-1) word
            newWordResult = newWord2 ++ newWord1
        in loop (i-1) (newWordResult : lst)

  in loop (length word) []

https://stackoverflow.com/questions/64573669/

相关文章:

python - 是否可以设置 lint 自定义设置并忽略 pylance

algorithm - 如果这个更简单、更快的算法有效,为什么我们需要 Dijkstra 算法?

r - 匹配和替换字符向量中的单词

python - 使用 boto3 获取新创建的亚马逊 ec2 实例的公共(public) IPv4

assembly - 如何将浮点常量移动到 FP 寄存器中?

c - 可能知道变量所在的内存部分?

kubernetes - 如何在我的 configmap.yaml (Helm) 中使用 json

vim - 如何在没有重新映射的情况下仅使用一个命令在 Neovim 的新选项卡中打开终端?

javascript - Angular 子组件无法识别输入更改

reactjs - 在 Next.js 中替换查询中的值