2016-01-31 2 views
-2

Так у меня есть функция, я делаю два, если заявления на первый один, кажется, работает, но второй один производит ошибкуПроверка строки равно значение хэш-карта Clojure - Не может быть отлиты

ClassCastException java.lang.String cannot be cast to clojure.lang.IFn user/sort-maps (NO_SOURCE_FILE:1559) 

функция проходит в два Карта «m1 + m2» и две строки «s1 s2» проблема кусок кода:

Что я пытаюсь сделать, это посмотреть, если строка «s1» равна строке от значения на «карте s2», но я продолжаю получать эту ошибку. Это функция у меня есть

(defn sort-maps [map1 map2 s2 s1] 
    (if-not (contains? map1 s2) 
    [(assoc map1 s2 s1) map2] 
    [map1 (assoc map2 s2 s1)]) 

    (if-not (= (get map1 s2)(s1)) 
    [(dissoc map2 (get map1 s2))] 
    [map1 (assoc map2 s2 s1)])) 

Мой вход:

"door" "rood" "odor" "pen" "list" "silt" "#" 

Мой выход я хочу бы:

{"enp" "pen"} 

Как я только хочу, чтобы вернуть слова, которые не могут быть сделаны вверх в любое другое слово на входе

+3

Для решения [см. Мой ответ на вопрос вашего одноклассника] (http://stackoverflow.com/questions/35116833/empty-maps-in-clojure/35117368) – munk

+0

Ввод не соответствует тому, что 'sort -маги "ожидает. Какие 'map1',' map2', 's2' и' s1' предназначены для вывода '{" enp "" pen "}'? – mobiuseng

ответ

2

s1 - это строка, но, обернув ее в parens, вы м вызов функции. Строка не является функцией, поэтому вы видите ошибку типа.

Вы, вероятно, хотите (if-not (= (get map1 s2) s1))

Но вы, кажется, имеют более глубокое недопонимание. Структуры данных Clojure: неизменяемые. Это означает следующее:

user=> (def my-map {:a 1 :b 2}) 
#'user/my-map 
user=> (assoc my-map :c 3) 
{:a 1, :b 2, :c 3} 
user=> my-map 
{:a 1, :b 2} 
user=> (dissoc my-map :a 1) 
{:b 2} 
user=> my-map 
{:a 1, :b 2} 

Таким образом, вы не можете просто изменить значение на месте, как вы можете с рубином или каким-либо другим языком.

+0

, если я сделаю то, что я не смогу использовать '[(disoc map2 (get map1 s2))]' для результата if будет? – Freeman

+1

Почему бы и нет?Возможно, вы должны отредактировать свой вопрос, чтобы объяснить, что вы думаете, что происходит здесь, а также пример ввода и вывода, который вы ожидаете. Я думаю, у вас есть более глубокое недоразумение, которое я пока не вижу. – munk

+0

Это то, что я пытаюсь достичь, это передать строки, такие как «дверь» «rood» «запах» «pen» «list» «silt», и я хочу только вернуть «перо», поскольку все остальные могут быть превращены в другое слово на входе – Freeman

2

munk правильно указал на источник вашей ошибки: (s1) сообщает Clojure вызывать s1 как функцию без аргументов. Однако, даже после исправления этого, ваш код вряд ли сделает то, что вы ожидаете от него.

Это тело функции sort-maps (с коррекцией Мунка): выполняется

(if-not (contains? map1 s2) 
    [(assoc map1 s2 s1) map2] 
    [map1 (assoc map2 s2 s1)]) 

(if-not (= (get map1 s2) s1) 
    [(dissoc map2 (get map1 s2))] 
    [map1 (assoc map2 s2 s1)]) 

Первое if-not заявление и результат (либо пара обновленных map1 и map2 или пара map1 и обновляется map2) выбрасывается. Поскольку карты в Clojure неизменяемы, assoc не собирается добавлять новую запись в существующую карту - вместо этого создается новая карта. Таким образом, эта функция тело полностью эквивалентно просто

(if-not (= (get map1 s2) s1) 
    [(dissoc map2 (get map1 s2))] 
    [map1 (assoc map2 s2 s1)]) 

Я не уверен, что вы делаете здесь, так что не может помочь вам в дальнейшем.

+0

Я все время сталкиваюсь с проблемой, с которой я раньше сталкивался с этим, когда я просто возвращаю это значение '([{}] [{}] [{}] [{}] [{}] [{}] [{}]) 'Что я делаю, это передать строки, такие как« дверь »« rood »« запах »« pen »« list »« silt », и я хочу только вернуть« pen », поскольку все остальные могут быть превращены в другое слово на входе – Freeman

+0

@Freeman вы можете разместить его как «вход -> ожидаемый результат» для функции 'sort-maps'. Я вижу, что вход должен состоять из двух карт и двух объектов (строк?). И кажется, что выход должен представлять собой пару обновленных карт. Но я ничего не могу вывести. Итак, если вы можете предоставить ожидаемые результаты по известному входу, это поможет. – mobiuseng

+0

Я редактировал, чтобы показать ввод/вывод, может быть другой, чтобы решить проблему, но я не могу понять, почему этот метод не работает. – Freeman

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