伙计们,我有以下功能,但我得到一个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)))
非常感谢任何建议
答案 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
。