我试图在Clojure中真正理解部分内容。 partial
采用函数f且少于f的正常参数,并返回一个带有可变数量的附加参数的fn。调用时,返回的函数使用args + additional args调用f。这是部分似乎没有意义的工作示例((partial map *) [1 2 3] [4 5 6] [7 8 9])
。 map
和*
是函数;因此partial
正在使用多个函数并使定义无效。任何人都可以帮助我更好地理解吗?
答案 0 :(得分:2)
作为参数的函数没有错。在您的情况下,map *
已创建,可以在以后使用:
(def will-map-multiply (partial map *))
与任何部分函数一样,其余的参数可以在以后提供:
(will-map-multiply [1 2 3] [4 5 6] [7 8 9]) ;=> (28 80 162)
那是“偏袒”#39;其中一个论点。可能是两个:
(def will-map-multiply-again (partial map * [1 2 3]))
(will-map-multiply-again [4 5 6] [7 8 9]) ;=> (28 80 162)
使用partial
时,第一个参数必须是一个函数,其他参数可以是任何函数 - 没有理由它们也不是函数。
你的例子有点复杂,因为乘以需要两个或多个参数,因此map
需要两个或更多个序列。
答案 1 :(得分:1)
你过分思考它。 partial
的第一个参数必须是函数。如果您的第一个参数是高阶函数,如map
或reduce
或许多函数其他
(partial map *)
第一个参数是一个函数map
。下一个参数是map
的有效参数。由于map
需要函数作为其第一个参数,因此partial
表达式需要函数作为其第二个参数。
就这么简单。您可以先将*
视为map
的参数,然后再将其视为partial
的参数。
答案 2 :(得分:1)
函数是Clojure中的第一类值。这意味着,您可以传递它们,例如整数,地图或字符串。
所以,(partial map *)
没什么奇怪的,其中函数*
只是map
的第一个参数。在您的情况下,partial
构造一个函数,然后将其他集合传递给map
。我们来看看:
(partial map *)
;; becomes
(fn [coll1 coll2 coll3] ;; other arities ommited
(map * coll1 coll2 coll3))
;; let’s call this fn with your collections
((fn [coll1 coll2 coll3]
(map * coll1 coll2 coll3)) [1 2 3] [4 5 6] [7 8 9])
;; becomes
(map * coll1 coll2 coll3)
同样,重点是函数在Clojure和许多其他函数语言中都是一流的。
希望这有帮助!
答案 3 :(得分:0)
(partial map *)
看起来很奇怪,但当人们意识到地图将函数作为其第一个参数时,它会变得更加清晰。 *
只是一个函数,它接受可变数量的参数并将它们相乘。因此,
(map * [1 2 3] [4 5 6] [7 8 9])
将*
应用于三个三位数字并生成[28 80 162]
。这一切都与偏见无关。混淆源于这样一个事实,即clojure函数通常作为参数传递给其他函数(实际上这在所有现代语言中都很常见,甚至是JavaScript!)。
因此,(partial map *)
完全意味着:使用预先选择的第一个参数(map
)获取*
并创建一个新函数,该函数使用其参数作为向量来执行映射。