如何在Clojure中列出部分函数?

时间:2014-06-01 21:10:13

标签: clojure

我需要在clojure中编写这样的代码。

-- haskell
fns = map (,) [1..3]
head fns $ 1
-- => (1,1)
fns <*> [1..3]
-- => [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]

不起作用

(def fns (map (partial list) (range 1 3)))
((first fns) 1)
;; => ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn

有效,但我认为这不是惯用的方式

(def fns (map (fn [x] `(partial list ~x)) (range 1 3)))
((eval (first fns)) 1)
;; => (1 1)

1 个答案:

答案 0 :(得分:6)

函数(partial list)仅相当于函数list。它不像哈斯克尔所有的东西都是咖喱的 - 我认为你打算partial看到它只给出了一个参数,list,然后自己等待第二个参数。但实际上应该是(partial partial list):您试图部分应用函数partial本身。

另请注意,部分应用的函数在clojure中并不像在haskell中那样常见,部分原因是它们读得不好。而不是(map (partial partial list) (range 1 3)),如果我想构建这样的函数列表,我可能会写(for [i (range 1 3)] (fn [j] (list i j)))