首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >clojure:(应用fn coll) vs (应用fn %&) coll)

clojure:(应用fn coll) vs (应用fn %&) coll)
EN

Stack Overflow用户
提问于 2012-10-07 00:19:18
回答 2查看 220关注 0票数 6

我正在通过labrepl工作,我看到了一些遵循以下模式的代码:

代码语言:javascript
运行
复制
;; Pattern
(apply #(apply f %&) coll)

;; Concrete example
user=> (apply #(apply + %&) [1 2 3 4])
10

这似乎相当于这种模式:

代码语言:javascript
运行
复制
;; Pattern
(apply f coll)

;; Concrete example
user=> (apply + [1 2 3 4]) 
10

这些模式是否等效?如果没有,有什么区别,你什么时候会用一个而另一个呢?

我在labrepl的细胞自动机实验室中从阶跃函数中获取了前一种模式:

代码语言:javascript
运行
复制
(defn step
  "Advance the automation by one step, updating all cells."
  [board]
  (doall
   (map (fn [window]
          (apply #(apply map brians-brain-rules %&)
                 (doall (map torus-window window))))
        (torus-window board))))

更新:--我添加了每种模式的具体示例,以帮助使问题更加清晰。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-07 01:07:51

不,没什么区别。没有理由编写更长的表单;我只能假设它是通过对代码的渐变来实现的,这些代码在同一时间是有意义的。

票数 4
EN

Stack Overflow用户

发布于 2012-10-07 00:42:17

本质上,这两种形式完成了相同的事情,或多或少是一样的。它们都提供了一种引入匿名函数的方法。

使用#(...是匿名函数的Clojure阅读器的缩写。它在某种程度上等同于(fn [arg1 & args]...,但不能将一个#(...匿名函数嵌入另一个函数中,并且参数被表示为% %2...%1 %2...,而不是使用向量绑定(fn [arg & args]

两者都是表示匿名函数的方法。#(...用于更简单的函数,(fn...用于更详细的函数。

#(...会使事情看起来更整洁一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12765035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档