zoukankan      html  css  js  c++  java
  • 函数式编程学习之路(二) 人工智能

    为什么要学习函数式编程?

    不啰嗦了,因为,所以,就学.实际上,现在主流编程里都有它,比如最基础的lamdba,C#有,Python有,JAVA最近也要引入这玩意,不学函数式编程,那么以后代码里的有lamdba的部分就搞不定,那么码农的身份地位可能要降级成码畜了.这是不可以接受的现实!!!

    那么,什么是函数式编程?

    这个问题...实际上,很难于回答,google下吧,

    函数式编程英语Functional programming),又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免状态以及可变数据。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。

    恩,有网络就是强啊,有百科给你解释的很清楚(真的很清楚吗?)

    不看还好,起初以为是写大堆函数来编程呢,仔细看下概念,这差距就象国美和美国一样.

    我们来尝试用已知的知识来理解下:

    1.是一种编程范型,:这个好理解,一个编程范型,过程式和面向对象就是.那么看上去象是个大概念,不简单

    2.将电脑运算视为数学上的函数计算,这个比较困难了,我们以前理解电脑运算是数学运算加逻辑运算的,对应的编程就是+-*/加逻辑比较,好理解,但数学上的函数运算,一听就头大,和数学函数挂钩了.看来里头有高深的数学知识,小心脏有压力.

    3.并且避免状态以及可变数据:这个说法让人凌乱,我们的经验知道,编程就是和状态,变量打交道的,避免状态以及可变数据,这是要逆天么?

    4.函数编程语言最重要的基础是 λ 演算(lambda calculus):彻底晕倒,神码叫TMD λ 演算?好在lambda用过一点,x => x.id == 1, 这样的代码写过,但内涵不太懂.好处是不明白怎么回事,但竟然还会用!

    5.λ演算的函数可以接受函数当作输入(引数)和输出(传出值):还好还好,这个本人明白,就是函数可以当函数的参数,函数返回值也可以是函数.套用本人一直说的,函数也可以当变量就好了,难道那就是函数式编程么?

    再往下看: 

    函数式编程和其它范型相比,更强调函数的计算

    也就是说函数及函数计算在函数式编程里,是相当原子及主要的操作.就象命令过程式里,语句是相当原子的操作,就象面向对象里,类定义及对象创建是相当原子的操作.

    函数式编程经常使用递归

    传统编程里递归有用,一般用在处理树型结构及层次型数据,象HTML及XML, JSON这些层次结构式数据,传统处理很麻烦得用各种库,函数式能轻松搞定?

    函数式的程序没有变量副作用。因为函数式程序设计语言没有变量,函数没有副作用,编写出的程序可以利用记忆化公共子表达式消除并发计算在运行时和编译时得到大量优化

    倒这里,感觉无变量无副作用,和面向对象有很大差别了.面向对象的属性很多时候就是变量,方法的副作用可大了.看来要写出函数不容易.

    在计算机科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响

    函数的副作用相关的几个概念, 纯函数(Pure Function)非纯函数(Impure Function)引用透明(Referential Transparent)

    范例(Java)

     f(x) 
     { 
       return x + 1 
     }
    

    f(x)函数就是纯函数

     a = 0 
     q(x) { 
       b = a 
     }
    

    q(x) 访问了函数外部的变量。q(x)是非纯函数

     p(x){ 
       print “hello” 
     }
    

    p(x)通过I/O API输出了一个字符串。p(x)是非纯函数。

     c(x) { 
       data = readConfig() // 读取配置文件 
     }
    

    c(x)通过I/O API读取了配置文件。c(x)是非纯函数。

    纯函数内部有隐式(Implicit)的数据流,这种情况叫做副作用(Side Effect)。我们可以把副作用想象为潜规则。上述的I/O,外部变量等,都可以归为副作用。因此,纯函数的定义也可以写为,没有副作用的函数,叫做纯函数。

    可以看出,函数要纯,还不能有潜规则,真希望以后GWY考增加函数式编程!

    特殊的函数副作用

    process(context) {
       a = context.getInfo()
       result = calculate( a )
       context.setResult( result )
     }
    这个...看到有副作用的函数,总会让人想起某些人某些事,看来,技术都是相通的.

    纯函数的好处主要有几点:

    • 无状态。线程安全。不需要线程同步。
    • 纯函数相互调用组装起来的函数,还是纯函数
    • 应用程序或者运行环境(Runtime)可以对纯函数的运算结果进行缓存,运算加快速度。
  • 相关阅读:
    3.2 线程复用:线程池
    3.1.7 线程阻塞工具类:LockSupport
    3.1.6 循环栅栏:CyclicBarrier
    3.1.4 读写锁
    3.1.5 倒计时器:CountDownLatch
    3.1.3 允许多个线程同时访问:信号量
    3.1.2 condition 条件
    3.1.1 重入锁 以及源码分析
    2.8.4 错误的加锁
    jsp中 scope="application" 表示
  • 原文地址:https://www.cnblogs.com/DSharp/p/3015731.html
Copyright © 2011-2022 走看看