我可以使用一组限制来模拟JavaScript中的函数式编程吗?

Adi*_*M P 5 javascript functional-programming

我正在观看Misko Hevery关于干净代码的讨论,他提到尝试编写一个程序,其中没有if语句(好,尽可能少)以模拟工作... Smalltalk或某些此类语言,其中多态性优于内联条件行为.

对于我有限的理解,函数式编程对于像我这样只是命令式的程序员来说很难 - 因为我们的状态变化方法没有办法在功能程序中表达.函数只接受一个值并返回一个值,并且对状态一无所知.

我也看到JS被誉为能够支持功能模型.

那么是否有一套简单的限制,类似于我的第一段,这将使我能够用我熟悉和喜爱的语言尝试功能范例 - 而不是学习一种全新的语言(我最终会这样做,但我想要现在尝试一下这种风气)?

sle*_*man 5

术语"函数式编程"有两个含义.

第一个含义是程序操作函数的能力.并非所有语言都可以这样做,但javascript是可以使用的语言之一.可以将函数赋值给变量,将函数传递给参数和返回函数的语言称为函数式编程语言,因此javascript按原样运行.

从这个意义上说,如果你看一下流行使用回调的任何现代javascript代码,那么你已经在进行函数式编程了.

函数式编程的第二个含义是编程风格,其中程序组合的主要方法是函数而不是变量.从这个意义上讲,几乎所有语言都可以通过避免变量赋值和循环结构而在函数式中使用(改为使用递归).

当你看到功能社区时,他们所说的功能是第一个含义加上第二个意义的强大版本 - 也就是说,变量不仅被避免而且被禁止.像Haskell这样的语言没有变量的概念.为了处理像I/O这样的副作用和可变状态,他们使用了一个名为monads的概念.

你不必走那么远.像Lisp和Forth这样的经典函数语言允许变量.你必须尽可能避免它们.

Lisp和Forth样式的函数式编程很大程度上是由处理列表/数组驱动的,没有为临时变量赋值.对某些人来说,这种风格更容易阅读.在命令式风格中你会这样做:

var a = [1,2,3];
var b = 0;
for (var i=0;i=a.length;i++) {
    b += a[i] * 2;
}
// result is in b
Run Code Online (Sandbox Code Playgroud)

在功能风格,你这样做:

[1,2,3].
    map(function(x){return x*2}).
    reduce(function(x,y){return x+y},0);
Run Code Online (Sandbox Code Playgroud)

从概念上讲,功能样式使得它看起来像是将过滤器应用于数组而不是遍历数组.如果您曾经使用过那样的命令行工具,grep那么您会发现这个概念非常熟悉.

请注意,我们在功能样式中根本没有引入任何变量赋值.

在功能样式的三个核心阵列方法/功能是:map,reducefilter.有了它们,你可以避免90%的for循环.

  • 啊哈,但是在哈斯克尔,你不能再重新让一个'[4,5,6]`你能吗?那不是变量,它只是一个宏(在C意义上,而不是在lisp意义上).这不是'a = b`那是'#define ab`.根据定义,"变量"是副作用.常数不是"变量",因此严格来说不是传统意义上的变量. (2认同)