2015-10-04 5 views
2

Вот мой код:почему это частичное не работает

 
(def partial-join (partial (clojure.string/join ","))) 

=>(clojure.string/join "," ["foo" "bar"]) 
"foo,bar" 

=> (partial-join ["foo" "bar"]) 

И это вызывает это исключение:

ClassCastException java.lang.String не может быть приведен к clojure.lang.IFn .repl/eval12557 (form-init2162333644921704923.clj: 1)

+1

Вы добавляете дополнительный слой круглых скобок, который не должен присутствовать при использовании частичного. – johnbakers

ответ

2

См. документ clojure.string/join.

clojure.string/join 
([coll] [separator coll]) 
    Returns a string of all elements in coll, as returned by (seq coll), 
    separated by an optional separator. 

когда только один аргумент предусмотрен для clojure.string/join, эта функция считает свой аргумент как сбор, так:

user=> (clojure.string/join ",") 
"," 

Далее см РОУ partial.

clojure.core/partial 
([f] [f arg1] [f arg1 arg2] [f arg1 arg2 arg3] [f arg1 arg2 arg3 & more]) 
    Takes a function f and fewer than the normal arguments to f, and 
    returns a fn that takes a variable number of additional args. When 
    called, the returned function calls f with args + additional args. 

Когда только один аргумент предоставлен, partial возвращает свой аргумент.

user=> (partial (clojure.string/join ",")) 
"," 

Попробуйте это:

user=> (def partial-join (partial clojure.string/join ",")) 
#'user/partial-join 
user=> (partial-join ["a" "b"]) 
"a,b" 
+0

Агатайн правильный, но имейте в виду '# (clojure.string/join", "%)' работает тоже. – Bill

-1

Wow. Стюарт Holloway использовал этот вопрос в качестве примера того, как НЕ отлаживать Clojure в Clojure Conj в Филадельфии:

https://youtu.be/FihU5JxmnBg

Я не думаю, что это плохо нуб вопрос (и принятый ответ был очень полезным), но он действительно ненавидел, как это было сформулировано/обрамлено.

Смежные вопросы