获取java.lang.ClassCastException:java.lang.Boolean无法强制转换为clojure.lang.IFn。思考?

时间:2014-09-29 13:59:29

标签: clojure

伙计们,我有以下功能,但我得到一个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)))

非常感谢任何建议

2 个答案:

答案 0 :(得分:3)

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

有你的问题。您评估and表达式,然后尝试将结果布尔值视为函数。尝试从该表达式中删除外部括号。

答案 1 :(得分: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