vlambda博客
学习文章列表

【每日一题】谈谈你对函数式编程的理解?

大家好,我是勾叔。今天的面试题是:谈谈你对函数式编程的理解?




问题分析


这是一个开放性的问题,没有标准答案,但是并不好回答。回答时要抓住函数式编程的核心特点进行论述,在论述的过程中会涉及到 Scala 中很多的概念。


核心问题回答


函数式编程(FP)是一种软件开发风格,它注重不依赖于编程状态的函数。函数式代码易于测试和复用,容易实现并发。
函数式编程中的函数指的是:数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。
比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。

函数式编程的基本特点:
  • 不可变性。默认变量是不可变的,如果要改变变量,需要把变量copy出去修改。这样一来,可以让程序少很多Bug。因为,程序中的状态不好维护,在并发的时候更不好维护;
  • first class functions 函数是一等公民。可以让函数像变量一样来使用。函数可以像变量一样被创建、修改、并当成变量一样传递,返回或是在函数中嵌套函数。理想状态下,这些函数应该是纯函数,纯函数是这样一种函数,相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。以下是一些常见的函数副作用:修改一个变量、直接修改数据结构、设置一个对象的成员、抛出一个异常或以一个错误终止、打印到终端或读取用户的输入、读取或写入一个文件;
  • 引用透明。函数的返回值只依赖于它的输入,这就是引用透明性。这个特性可以帮助我们更好的分析我们的程序;
  • 少用循环和遍历,多使用 map 、 reduce等函数。函数式编程最常见的技术就是对一个集合做Map和Reduce操作。这比起过程式的语言来说,在代码上要更容易阅读;
  • 递归与尾递归:递归最大的好处就简化代码,把一个复杂的问题用很简单的代码描述出来。递归的精髓是描述问题,而这正是函数式编程的精髓;如果递归很深的话,stack受不了,并会导致性能大幅度下降。使用尾递归优化技术——每次递归时都会重用stack;
  • 柯里化:把一个函数的多个参数分解成多个函数,然后把函数多层封装起来,每层函数都返回一个函数去接收下一个参数这样,可以简化函数的多个参数;
  • 高阶函数:所谓高阶函数就是函数当参数,把传入的函数做一个封装,然后返回这个封装函数。现象上就是函数传进传出,就像面向对象满天飞一样;

大家如果想进行更深入的了解和学习,请关注勾叔谈大数据参与更多互动。



推荐阅读: