Clojure中的部分函数需要多个函数

时间:2016-02-21 04:19:38

标签: clojure

我试图在Clojure中真正理解部分内容。 partial采用函数f且少于f的正常参数,并返回一个带有可变数量的附加参数的fn。调用时,返回的函数使用args + additional args调用f。这是部分似乎没有意义的工作示例((partial map *) [1 2 3] [4 5 6] [7 8 9])map*是函数;因此partial正在使用多个函数并使定义无效。任何人都可以帮助我更好地理解吗?

4 个答案:

答案 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的第一个参数必须是函数。如果您的第一个参数是高阶函数,如mapreduce或许多函数其他

(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)获取*并创建一个新函数,该函数使用其参数作为向量来执行映射。