在clojure中生成子串

Loc*_*rde 5 for-loop substring clojure

我试图在clojure中生成给定字符串的所有可能的前缀子串.例如,如果单词是Ninja,我想要输出("N" "Ni" "Nin" "Ninj" "Ninja")

我可以轻松地做到这一点:

user=> (def a "Ninja")

user => (for [x (range 1 (+ 1 (.length a)))]
          (subs a 0 x))

("N" "Ni" "Nin" "Ninj" "Ninja")
Run Code Online (Sandbox Code Playgroud)

这一切都很好......除了..我在那里使用for循环..它看起来并不是非常clojure-y ..有没有更好/正确的方法来做这个没有for循环或是for loop在这种情况下完全可以吗?

谢谢

A. *_*ebb 5

subs在你的for理解中映射长度或明确映射是我要做的。

但是,如果您真的想要更高级别的功能,则可以使用reductions

(rest (reductions str (str) "Ninja"))
;=> ("N" "Ni" "Nin" "Ninj" "Ninja")
Run Code Online (Sandbox Code Playgroud)

如果您想要后缀,那么您可以很好地使用iterate并且subs因为您不必指定结尾。

(take-while seq (iterate #(subs % 1) "Ninja"))
;=> ("Ninja" "inja" "nja" "ja" "a")
Run Code Online (Sandbox Code Playgroud)