clojure - 以向量作为参数的匿名函数内的括号

标签 clojure

我还在学习 clojure,我有疑问

当我编写匿名函数时,我会这样做

fn [parameter] 
 (do something)

好的..函数体由一组括号括起来

现在我正在阅读这样的斐波那契解决方案

(iterate (fn [[a b]] [b (+ a b)]) [0 1]))

我的疑问是为什么它不是这样的

(iterate (fn [[a b]]  (    [b (+ a b)]   ))   [0 1]))

我用 () 将该函数括起来

(iterate (fn [[a b]]   "("    [b (+ a b)]   ")"  )   [0 1]))

它接收一个向量,然后返回与其他向量不同的主体函数...

当我使用类似向量的参数调用函数时,情况会有所不同,否则我会犯一个大错误。

最佳答案

如果函数返回向量,则不需要用任何东西包裹它,只需在括号中返回向量即可。函数体不一定“包裹”在括号中,这很常见,因为通常函数在返回值之前会做几件事,其中涉及使用括号。

因此,如果您只是从函数返回向量,则函数的“主体”可以是[foo,bar,baz]。如果您要返回 map ,则函数主体可以是 {:a foo, :b bar, :c baz}。如果您返回单个值,它可能是单个符号。

唯一“包裹”在括号中的是整个函数定义本身,无论是 (fn [] ...)#(...)、或(defn [] ...)

进一步说明:方括号和大括号 []{} 实际上只是语法分别为 (vector) 函数和 (hash-map) 函数提供糖,因此 [1,2,3](vector 1 2 3){:a foo, :b bar}(hash-map :a foo :b bar) 相同>。如果它可以帮助您看到“包裹”在括号中的函数体,您可以使用较长的函数名称来返回 Clojure 的向量和映射数据类型,但使用方括号和大括号更为惯用。

关于clojure - 以向量作为参数的匿名函数内的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6202439/

相关文章:

clojure - 在 Clojure 中如何从函数早期返回?

clojure - 使用莱宁根 Clojars 的镜子

java - 用于穿越 NAT 的 clojure 友好 Java 库

java - 当探查器无法收集样本时,如何调试无响应的服务器?

java - 在 Windows 10 上使用 Clojure/Java 的 NginX - 未启动

testing - 如何以一对多的方式编写 clojure.test.check 生成器?

clojure - 如何在clojure中随机生成一个长数

clojure - 立即杀死正在运行的 future 线程

maven - 如何从 docker 容器内访问私有(private) maven 存储库?

clojure - 如何将现有的函数应用到新的类中?