2014-09-29 74 views
2

Folks,我有下面的函数,但我得到一个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 2014-09-29 15:30:00

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

相关问题