Syntax Clojure中匿名函数的fn和#语法之间有区别吗?

Syntax Clojure中匿名函数的fn和#语法之间有区别吗?,syntax,clojure,lambda,anonymous-function,Syntax,Clojure,Lambda,Anonymous Function,我是clojure的新手,我见过匿名函数的编写方式如下: (fn [x] (* x x)) 也像: #(* % %) 显然,第二个更简洁。有什么相关的区别吗?每个匿名函数都可以用这两种样式表示吗?还有一个更地道吗 关于这个问题,我无法确定如何将(fn[x][x])转换为后一种语法。我希望能提供一份文件来澄清这种情况。从中,我认为这些是最相关的区别: 惯用语言用于非常短的一次性映射/过滤器FN等 #()表单不能嵌套 另一件事是,如果需要命名参数,fn是一个更好的选择。对于#(),您将使用%或多

我是clojure的新手,我见过匿名函数的编写方式如下:

(fn [x] (* x x))
也像:

#(* % %)
显然,第二个更简洁。有什么相关的区别吗?每个匿名函数都可以用这两种样式表示吗?还有一个更地道吗

关于这个问题,我无法确定如何将
(fn[x][x])
转换为后一种语法。我希望能提供一份文件来澄清这种情况。

从中,我认为这些是最相关的区别:

惯用语言用于非常短的一次性映射/过滤器FN等

#()表单不能嵌套


另一件事是,如果需要命名参数,fn是一个更好的选择。对于#(),您将使用%或多个参数,如%1、%2等(还有%&)。

最重要的区别是:

  • (fn…
    可以嵌套,
    #()
    不能嵌套
  • 您可以使用
    (fn[x y]..
    或类似工具更好地命名参数,而不是使用
    %
    %2
    %3
  • 您可以使用
    (fn…
    命名函数以供递归使用,例如
    (fn fib[n](如果(另一个SO答案()提到
    #([%])
    扩展为
    fn[%]([%])
    (注意括号),这会导致算术异常


    你可以做
    #(vector%%)
    来解决这个限制。

    另一个值得一提的限制(我不知道我是否可以/应该编辑你的响应)是
    fn
    允许你命名你的函数,以便它们可以在主体中引用,如:
    (def-fact(fn-f[x](if(=1x)1(*x(f(dec x))中)
    非常感谢
    comp
    partial
    的建议。我想知道这些建议是否存在,我在Haskell对它们表示了赞赏。我无法告诉你我为此浪费了多少时间。#()没有隐含的do。(fn[…)有。详细说明@Bill的评论: