2014-04-08 19 views
5

Tôi đang cố gắng tạo tất cả các phần tử tiền tố có thể có của một chuỗi đã cho trong clojure. Ví dụ, nếu từ đó là Ninja, tôi muốn đầu ra được ("N" "Ni" "Nin" "Ninj" "Ninja")Tạo các chất nền trong clojure

tôi có thể dễ dàng làm điều đó với điều này:

user=> (def a "Ninja") 

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

("N" "Ni" "Nin" "Ninj" "Ninja") 

Và đây là tất cả tốt ... trừ .. Tôi đang sử dụng cho vòng lặp trong đó .. và nó không trông rất clojure-y .. là có một cách tốt hơn/thích hợp để làm điều này mà không có vòng lặp for hoặc là vòng lặp hoàn toàn okay trong trường hợp này?

cảm ơn bạn

+0

phải rõ ràng, 'for' trong Clojure không phải là một vòng lặp for, đó là một danh sách hiểu – noisesmith

Trả lời

4

Mapping subs so với chiều dài như trong for hiểu hoặc with map explicitly là những gì tôi muốn làm là tốt.

Tuy nhiên, nếu bạn thực sự muốn có một chức năng cấp cao hơn, bạn có thể sử dụng reductions

(rest (reductions str (str) "Ninja")) 
;=> ("N" "Ni" "Nin" "Ninj" "Ninja") 

Nếu bạn đã muốn hậu tố thay vào đó, bạn có thể làm như vậy độc đáo với iteratesubs vì bạn sẽ không có để chỉ định kết thúc.

(take-while seq (iterate #(subs % 1) "Ninja")) 
;=> ("Ninja" "inja" "nja" "ja" "a") 
+0

không biết về chức năng đó - http://clojuredocs.org/clojure_core/clojure.core/reductions – Scott

+0

giảm là khá thú vị, cảm ơn! Ngoài ra cảm ơn cho ý kiến ​​về 'for', tôi nghĩ rằng, đối với người đọc, nó có thể là rất nhiều rõ ràng hơn là những gì nó làm hơn giảm. – LocustHorde

4

for hiểu là hoàn toàn ổn, IMO. Nếu bạn muốn xem cách tiếp cận khác, đây là những gì tôi sẽ làm gì:

(map (partial subs a 0) (range 1 (-> a count inc))) 
;; ("N" "Ni" "Nin" "Ninj" "Ninja") 
+0

Thay vì' (lặp lại a) ', chỉ nơi 'a' làm đối số đầu tiên cho' subs'. –

+0

@ A.Webb gợi ý hay. Bây giờ nó là khá nhiều câu trả lời của bạn :) – Kyle

+1

Vâng, đó là lý do tại sao tôi đã xóa của tôi :). –

1

Bạn có thể sử dụng reduce

user=> (reduce #(conj % (str (first %) %2)) '() "Ninja") 
("Ninja" "Ninj" "Nin" "Ni" "N") 
Các vấn đề liên quan