也许在clojure

Ste*_* B. 1 clojure

试图在clojure中编写一个以第一个nil值退出的组合函数(例如,你通过将Maybes链接在haskell中来完成的事情),具体如下:

(defn wrap [f] (fn [x] (if (nil? x) nil (f x))))

(defn maybe [arg & functs] ( (comp (reverse (map wrap functs))) arg))
Run Code Online (Sandbox Code Playgroud)

所以,我会得到,例如

(defn f1 [x] (+ x 1))

(maybe 1 f1 f1 ) => 3

(maybe nil f1 f1) => nil
Run Code Online (Sandbox Code Playgroud)

不幸的是,这给了我:ClassCastException clojure.lang.PersistentList无法强制转换为clojure.lang.IFn用户/也许(NO_SOURCE_FILE:1)

有人可以帮我解决我在这里做错了什么吗?这样做的惯用方法是什么?

Wol*_*Fan 7

这样做的惯用方法是使用some->.有关更多详细信息,请参阅此宏的文档.

当然,不要让那阻止你做自己的!


Dax*_*ohl 5

comp期望每个函数作为单独的参数,但您将函数列表作为单个参数传递给它。要解决这个问题,请使用apply.

(defn maybe [arg & functs] ( (apply comp (reverse (map wrap functs))) arg))
Run Code Online (Sandbox Code Playgroud)