试图在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)
有人可以帮我解决我在这里做错了什么吗?这样做的惯用方法是什么?
comp期望每个函数作为单独的参数,但您将函数列表作为单个参数传递给它。要解决这个问题,请使用apply.
(defn maybe [arg & functs] ( (apply comp (reverse (map wrap functs))) arg))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |