我需要在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)
答案 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)))
。