匿名函数内的括号,矢量作为参数

coc*_*oco 3 clojure

我还在学习clojure,我有一个疑问

当我写一个匿名函数时,我这样做

fn [parameter] 
 (do something)
Run Code Online (Sandbox Code Playgroud)

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

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

(iterate (fn [[a b]] [b (+ a b)]) [0 1]))
Run Code Online (Sandbox Code Playgroud)

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

(iterate (fn [[a b]]  (    [b (+ a b)]   ))   [0 1]))
Run Code Online (Sandbox Code Playgroud)

我附上了这个函数 ()

(iterate (fn [[a b]]   "("    [b (+ a b)]   ")"  )   [0 1]))
Run Code Online (Sandbox Code Playgroud)

它接收一个向量然后返回正文函数比其他向量...

当我使用像参数这样的向量调用函数或者我犯了一个大错误时,它会有所不同.

sem*_*ros 8

如果函数返回一个向量,则不需要用任何东西包装它,只需在其括号中返回向量即可.函数的主体不一定"包裹"在括号中,它只是非常常见,因为通常函数在返回值之前会做几件事,这涉及到使用括号.

因此,如果您只是从函数返回一个向量,则函数的"主体"可以是[foo,bar,baz].如果你要返回一张地图,那么该函数的主体可以是{: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的向量和映射数据类型,但使用括号和括号更加惯用.