繁体   English   中英

Javascript是一种函数式编程语言吗?

[英]Is Javascript a Functional Programming Language?

仅仅因为函数是第一类对象,有闭包和高阶函数,Javascript是否应该被称为函数式编程语言? 我认为它缺少的主要功能是纯函数,并且它不像其他函数语言那样“感觉”,比如lisp(虽然这不是一个很好的理由,它不是一个功能性的语言......)

重复我自己对类似问题的回答,

功能编程语言没有公认的定义。

如果将函数式语言定义为支持第一类函数和lambdas的语言,那么是的,JavaScript *是一种函数式语言。

如果您还考虑了支持不变性,代数数据类型,模式匹配,部分应用等因素,那么,JavaScript *不是*函数式语言。


我建议您阅读以下相关博客文章(以及下面的评论):

我会说这是一种多范式的语言。

编辑:这是多范式,包括功能结构。

如果你将“函数式编程”这个术语拉伸并扭曲到哲学讨论的角度,这个问题可能会再次开放。 然而,那么你最终会得到一些有用的问题,例如“C ++真的是一种编程语言”吗?

每日更多问题的答案是“不”

函数式编程意味着程序被概念化为函数的评估,而不是控制流。 代码是函数的描述,并没有控制流的固有概念。

JavaScript有一个控制流程,并被概念化为命令式语言。 从设计目标来看,它显然不是一种功能语言。

这些天来,“函数式编程”这个术语过度使用它几乎是无用的。 有两个主要含义:

  1. 拥有一流的功能
    • Javascript就是这个!
  2. 基于lambda演算中使用的函数,重点是避免持久的可变状态(通常用传递给函数的参数替换它)
    • 通常写的,Javascript不是远程的!

选择你的意思然后问题是可以回答的。

我不认为函数式编程有一个具体的定义,但人们认为“函数式编程”的许多东西可以用javascript完成。 这是本文中的一个很好的简短示例

对我来说,Javascript既是命令式语言又是函数式语言,你可以选择以任何方式使用它,甚至( egad )两种方式。 或者你可以选择使用一种范例,而不是接触另一种范例。 由你决定。 我和你一样,不认为Javascript应该被称为功能语言,因为它允许你进入和退出功能编程范例。 也许如果它有某种类型的pragma,限制你只使用函数式编程范例,那么这将是有用的,我认为。 但是,总而言之,我说它更像是一种命令式/过程式语言,其中包含一些函数式编程功能。

我倾向于不认为编程语言有一个特定的范例,但它们适合于某些范式。 然而,仅仅因为它们适合某种特定范式并不意味着你必须使用这种范式。 用C编写面向对象的程序并在ML中编写命令式程序是完全可能的。 没有使用某种范式来解决问题,因为语言不是为它而设计的,只是人为限制自己(当然,在决定某个特定解决方案是否是一个好的解决方案时,你仍然应该考虑语言的局限性)。

@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]())
   })

但我知道这种方式对于大循环有缺点......

关于JS尾部优化优化的相关问题

PS发布在这里因为发布评论时代码格式有问题

好吧,我不会说它是函数式编程,但后来我说它是面向对象的,就在今天,一位朋友说他也不会把它放在那个架子上。

所以,虽然我不会这么说,但我觉得还有发表意见的空间。 它确实具有函数式编程的经典特性,它没有其他特性。

Javascript是有道理的。 这真的取决于你如何编程。 如果我以OO方式编码,它不是OO吗? 因此,如果您只是以“功能”方式对事物进行编码,那么它就会起作用。 我想这是多范式语言所以称之为一件事并不完全准确。

在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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM