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

use*_*543 2 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)]
Run Code Online (Sandbox Code Playgroud)

不起作用

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

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

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

ama*_*loy 6

该功能(partial list)仅相当于该功能list.它并不像haskell那里的所有东西都是咖喱的 - 我认为你打算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))).