仅仅因为函数是一流的对象,就存在闭包和高阶函数,Javascript是否值得被称为功能编程语言?我认为它缺少的主要功能是纯函数,它不像其他函数语言(如lisp)那样“感觉”(尽管这并不是使其成为功能语言的充分理由……)
仅仅因为函数是一流的对象,就存在闭包和高阶函数,Javascript是否值得被称为功能编程语言?我认为它缺少的主要功能是纯函数,它不像其他函数语言(如lisp)那样“感觉”(尽管这并不是使其成为功能语言的充分理由……)
Answers:
重复我对类似问题的回答,
功能编程语言尚无公认的定义。
如果将功能性语言定义为支持一等函数和lambda的语言,那么可以,JavaScript是一种功能性语言。
如果您还考虑诸如对不变性的支持,代数数据类型,模式匹配,部分应用程序等因素,那么不,JavaScript *不是*功能语言。
我鼓励您阅读以下相关博客文章(以及它们下方的评论):
我会说这是一种多范式语言。
编辑:这是多范式,包括功能构造。
如果您将术语“函数式编程”延伸或扭曲到哲学讨论的目的,那么这个问题可能会再次公开。但是,然后您遇到了一些有用的问题,例如“ C ++真的是一种编程语言”吗?
每天您的问题的答案是“否”。
函数式编程意味着将程序概念化为函数的评估,而不是控制流。该代码是对功能的描述,没有控制流程的固有概念。
JavaScript具有控制流,并被概念化为命令性语言。从其设计目标来看,它显然不是功能语言。
如今,术语“函数式编程”语言是如此繁琐,几乎毫无用处。有两个主要含义:
选择您的意思,然后问题就可以回答了。
对我来说,Javascript既是命令式语言又是功能性语言,您可以选择以任何一种方式使用它,甚至可以使用(egad)两种方式使用它。或者,您可以选择使用一种范例,而从不接触另一种。由你决定。我和您一样,不认为Java 语言应被称为功能语言,因为它使您可以进入和离开功能编程范式。我想,也许如果它有某种实用性来限制您仅使用函数式编程范例,那将很有用。但是,总而言之,我说这更多是一种命令式/过程性语言,并引入了一些功能编程功能。
好吧,我不会说这是函数式编程,但是我会说它是面向对象的,直到今天,一个朋友说他也不会把它放在那个架子上。
因此,虽然我不会说是,但我认为仍有意见余地。它确实具有函数式编程的经典功能,没有其他功能。
Java语言是有道理的。这确实取决于您如何进行编程。如果我以面向对象的方式编写代码,那不是面向对象的吗?因此,如果您仅以“功能性”方式编写代码,那么它将是功能性的。我猜这是多范式语言,所以仅称之为一件事并不完全准确。
@petraszd我重写代码一点,以获得一个“新” 的操作:
function ffor(a, b, f){
function it(i){
if(i > b)return
f(i)
it(i+1)
}
it(a)
}
print("----" + new Date()+"----")
var funcs = []
ffor(0, 9, function(i){
funcs.push(function(){return i})
})
ffor(0, 9, function(i){
print(funcs[i]())
})
但是我知道这种方式对大循环不利。
PS张贴在这里,因为发表评论时,代码格式有问题
在Javascript中,您可以执行以下操作!
// Data
var fruits = [
{ name: 'apple', price: 5 },
{ name: 'orange', price: 10 },
{ name: 'lemon', price: 15 }
]
// Request Data from magicURL
request('magicURL')
.then(selectKeyOf('price'))
.then(priceMethod('sum'))
.then((result)=>{
console.log(result) // 30
})
为了演示这个概念,我制作了一个github页面,您可以克隆/查看我的实现。
众所周知,函数式编程语言不允许更改或变异函数的元素(状态),但是在javascript中,虽然函数式语言将函数视为一等公民,但从某种意义上讲,它不是函数式编程语言。
我真正讨厌javascript(如果您尝试将其视为FP语言)的是:
function getTenFunctionsBad() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push(function () {
return i;
});
}
return result;
}
function getTenFunctions() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push((function (i) {
return function () {
return i;
}
})(i));
}
return result;
}
var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
// using rhino print
print(functionsBad[i]() + ', ' + functions[i]());
}
// Output:
// 10, 0
// 10, 1
// 10, 2
// 10, 3
// 10, 4
// 10, 5
// 10, 6
// 10, 7
// 10, 8
// 10, 9
您需要了解JS堆栈环境(如果它是正确的术语,我就不需要)以了解这种行为。
例如,在方案中,您只是无法产生这种东西(好吧,好吧-借助基础语言的引用,您可以做到):
(define (make-ten-functions)
(define (iter i)
(cond ((> i 9) '())
(else (cons (lambda () i) (iter (+ i 1))))))
(iter 0))
(for-each (lambda (f)
(display (f))
(newline)) (make-ten-functions))