我还在学习 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/