为匿名函数分配名称与定义名称"通常"

时间:2016-04-30 13:19:37

标签: function racket

通常在Racket文档/手册中我会找到类似的内容:

(define greet
    (λ (name) (format "Hello, ~a!" name)))

我没有看到这样的优势:

(define (greet name)
    (format "Hello, ~a!" name))

将函数分配给名称而不是(define (ident args...) exprs...)正常方式似乎与JS中的相同内容类似:

// "usual" declaration
function greet (name) { return `Hello ${name}!` };     

// assigning
const greet = name => `Hello, ${name}!`;
const greet = function (name) { return `Hello ${name}!` };

或Python(未使用,因为lambda不仅仅是功能;它们不太有用):

def greet(name): return f"Hello, {name}!" # full definition

greet = lambda name: f"Hello {name}!"      # not idiomatic
  • 在JS中,const greet(本地)的范围与function greet(全局)的范围不同,因此更喜欢const greet
  • 在Python中,lambda只能有一个表达式,它们是返回值;你不能声明或指定变量,所以更喜欢正确的定义。

据我所知,Racket与(define (ident args... ) exprs...)(define ident (λ (args...) exprs...)之间允许的范围或类型的陈述没有区别。

为什么一个用于另一个?有优势吗?是可读性,个人偏好还是惯用语?

1 个答案:

答案 0 :(得分:4)

没有区别。

大多数人更喜欢语法(define (greet name) ...)。如果你想强调函数是值,那么编写(define greet (lambda (name) ...))是有意义的。在印第安纳大学,语法(define greet (lambda (name) ...))用于强调这一点(函数是第一类值)。