通常在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
const greet
(本地)的范围与function greet
(全局)的范围不同,因此更喜欢const greet
。lambda
只能有一个表达式,它们是返回值;你不能声明或指定变量,所以更喜欢正确的定义。据我所知,Racket与(define (ident args... ) exprs...)
和(define ident (λ (args...) exprs...)
之间允许的范围或类型的陈述没有区别。
为什么一个用于另一个?有优势吗?是可读性,个人偏好还是惯用语?
答案 0 :(得分:4)
没有区别。
大多数人更喜欢语法(define (greet name) ...)
。如果你想强调函数是值,那么编写(define greet (lambda (name) ...))
是有意义的。在印第安纳大学,语法(define greet (lambda (name) ...))
用于强调这一点(函数是第一类值)。