Syntax Clojure中匿名函数的fn和#语法之间有区别吗?
我是clojure的新手,我见过匿名函数的编写方式如下:Syntax Clojure中匿名函数的fn和#语法之间有区别吗?,syntax,clojure,lambda,anonymous-function,Syntax,Clojure,Lambda,Anonymous Function,我是clojure的新手,我见过匿名函数的编写方式如下: (fn [x] (* x x)) 也像: #(* % %) 显然,第二个更简洁。有什么相关的区别吗?每个匿名函数都可以用这两种样式表示吗?还有一个更地道吗 关于这个问题,我无法确定如何将(fn[x][x])转换为后一种语法。我希望能提供一份文件来澄清这种情况。从中,我认为这些是最相关的区别: 惯用语言用于非常短的一次性映射/过滤器FN等 #()表单不能嵌套 另一件事是,如果需要命名参数,fn是一个更好的选择。对于#(),您将使用%或多
(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
的建议。我想知道这些建议是否存在,我在Haskell对它们表示了赞赏。我无法告诉你我为此浪费了多少时间。#()没有隐含的do。(fn[…)有。详细说明@Bill的评论:partial