在Clojure中使用“apply”函数时出错:“不知道如何从:java.lang.Long创建ISeq”

时间:2012-08-24 04:56:59

标签: exception clojure higher-order-functions first-class-functions

在“行动中的Clojure”(第63页)中使用以下示例:

(defn basic-item-total [price quantity] 
    (* price quantity))

(defn with-line-item-conditions [f price quantity] 
    {:pre [(> price 0) (> quantity 0)]
     :post [(> % 1)]} 
    (apply f price quantity))

评估REPL:

(with-line-item-conditions basic-item-total 20 1)

导致抛出以下异常的结果:

Don't know how to create ISeq from: java.lang.Long
  [Thrown class java.lang.IllegalArgumentException]

在评估应用程序后,似乎抛出了异常。

1 个答案:

答案 0 :(得分:8)

apply的最后一个参数应该是sequence of arguments。在您的情况下,用法可能看起来更像这样:

(defn with-line-item-conditions [f price quantity] 
    {:pre [(> price 0) (> quantity 0)]
     :post [(> % 1)]} 
    (apply f [price quantity]))
当您使用参数列表时,

apply非常有用。在您的情况下,您只需调用函数:

(defn with-line-item-conditions [f price quantity] 
    {:pre [(> price 0) (> quantity 0)]
     :post [(> % 1)]} 
    (f price quantity))