2014-09-29 2 views
2

Люди, у меня есть функция ниже, но я получаю java.lang.ClassCastException: java.lang.Boolean не может быть отброшен в clojure.lang.IFn «ошибка при запуске. Любые мысли о том, как ее исправить?Получение java.lang.ClassCastException: java.lang.Boolean нельзя отнести к clojure.lang.IFn. Мысли?

(defn tickets [price] (fn [price] ((and proms/med-to-high? 
              (partial checks/price-matches? price))))) 

Я пытаюсь использовать вышеуказанную функцию в следующей функции. То, что я хочу сделать, это проверить, если билет по определенной цене, и если нет, то печать билета не

(defn right-tickets? 
"Returns true for right ticket.Else, print something" 
    [price] 
    (if (tickets? price) true (do (println "Ticket not at right price") false))) 

Любое предложение высоко оценивается

ответ

3
((and proms/med-to-high? 
(partial checks/price-matches? price)) 

У вас возникли проблемы. Вы оцениваете выражение and, а затем пытаетесь обработать результирующее логическое значение как функцию. Попробуйте удалить внешние скобки из этого выражения.

+0

Сделал исправление, но, похоже, не исправил проблему – sparrow

0

Помимо ошибки, @user100464 указует,

  • слишком много глобального состояния
  • вы смешиваете вычисления с отчетностью.

Но сначала вы вызываете функцию tickets?, указав ее с другим именем tickets. Пойдем для последнего.

В tickets, proms/med-to-high?, по-видимому, являются глобальными данными. Я думаю, из формулировки, что это относится к некоторому событию, в котором также есть некоторые цены на билеты. Мы можем представить данные о событии в виде карты, скажем

{:prom :low, :prices #{10.50 15.00 25.00}} 

Тогда ваша tickets функция может быть

(defn tickets [event price] 
    (and (#{:medium :high} (:prom event)) ((:prices event) price))) 

Для случаев,

(tickets {:prom :low, :prices #{10.50 15.00 25.00}} 15.0) 
;nil 

(tickets {:prom :medium, :prices #{10.50 15.00 25.00}} 10.0) 
;nil 

(tickets {:prom :medium, :prices #{10.50 15.00 25.00}} 15.0) 
;15.0 

Но если я готов потратить £ 20 на билет, то один на £ 10 в порядке. Поэтому я хочу, чтобы увидеть диапазон цен квалификационных:

(defn tickets [event price] 
    (and 
    (#{:medium :high} (:prom event)) 
    (seq (filter (partial >= price) (:prices event))))) 

Для случаев,

(tickets {:prom :medium, :prices #{10.50 15.00 25.00}} 10.0) 
;nil 

(tickets {:prom :medium, :prices #{10.50 15.00 25.00}} 20.0) 
;(10.5 15.0) 

Это может быть, что цены были на карту, давая количество билетов по каждой цене .. . и так далее.

билет функция сообщение может быть

(def ticket-message {nil "No tickets at the price"}) 

Который, примененной к nil, дает сообщение, но применительно к чему-либо, урожайности nil.

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