Как мне превратить (seq «foo») обратно в строку?

#clojure

#clojure

Вопрос:

Я изучаю clojure и озадачен. Что заполняет пробел, чтобы следующее выражение приняло значение true?

 (= "foo" ___ (str (seq "foo")))
  

Ответ №1:

Вам нужно использовать функцию apply:

 user=> (apply str (seq "foo"))
"foo"
  

Комментарии:

1. Имеют ли функции Clojure максимальную размерность (значительно меньшую, чем, например, максимальная длина вектора)? Например. если строка здесь была действительно длинной, то apply попытались бы вызвать str с таким количеством аргументов (символов из строки), что вызов завершился бы неудачей.

Ответ №2:

На самом деле ничто не может заполнить пробел, чтобы сделать выражение (= «foo» _ (str (seq «foo»))) равным true, потому что (str (seq «foo»)) => «(f o o)», которое не равно «foo», поэтому у нас уже есть неравенство, и третий элемент, независимо от того, какое значение, для заполнения пробела, не может заставить выражение оценить значение true

Если вы хотели спросить

 (= "foo"
    (____ str (seq "foo")))
  

Тогда ответом было бы правильно применить, как ответил Алекс.

 user> (doc apply)
-------------------------
clojure.core/apply
([f args* argseq])
  Applies fn f to the argument list formed by prepending args to argseq.
  

Apply принимает функцию (в данном случае str) и вызывает str с аргументами, присутствующими в seq

 user> (seq "foo")
(f o o)

user> (str f o o)
"foo"
  

И, кстати:

 user> (= 1 1 1)
true

user> (= 1 2 1)
false
  

Комментарии:

1. на самом деле (comp (partial apply str) read-string) сработало бы для заполнения первого пробела 🙂

Ответ №3:

Или вы могли бы использовать удобный clojure.string/join

 (require 'clojure.string)
(clojure.string/join (seq "foo"))
  

Также будет напечатано "foo" . Вы могли бы, конечно, определить свой собственный, join используя ранее упомянутую технику (чтобы избежать постоянной записи (apply str seq) ).