【函数式编程】什么是函数式编程? C语言为何不是函数式语言?

什么是函数式编程? C语言为何不是函数式语言?

函数式语言有两个主要的特点:1. 函数是“头等公民”。2. 数据的“immutability”(不变;永恒性;不变性;). 操作的“无副作用”,
这规避了‘锁’。
函数式编程的函数是指数学上的函数:给定输入固定的输出,没有副作用。任何语言都可以用函数式的风格,
只是难易不同罢了。
比如有函数 y = f(x). 和 函数 x = g(z); 可以组成复合函数 y=f(g(z));

对于第二个问题,C为何不是函数式语言?

因为这种效果在C里面不能实现: y=f(g(z));

int f(int x) { print x;}             ===== y = f(x)
int g(int z) {return z;}             ===== x = g(z)
int f1(int (*g)(int)) { print g(z);} ===== y = f1(g(z))


从上面的函数定义可以看到,当函数f(x)的参数定义为int时,便不能将函数g(z)作为形参传递给它。(函数指针与int参数类型不匹配)
反过来看函数f1()也不能接受int作为参数了。

于是,C达不到数学上函数的那种效果。

而在clojure里面却可以。

(defn f [x] (print x))    ======= y = f(x)
(defn g [z] z)            ======= t = g(z)



这时,(f (g 3)) 和 (f 3) 的结果是一样的,达到了数学上的效果。
再者,C也不具有函数式语言的特点2.

常见的函数式语言有哪些?

coljure、scala、Haskell。

为什么如python/javascrip这些语言不是函数式语言呢,因为他们不具备函数式语言的特点2.
————————————————
原文链接:https://blog.csdn.net/lx1848/article/details/77619881

 

毫无干货的带你理解什么是函数式编程

 

世界模型

如果让你搭建一个模型来描述这个世界你会怎么做?

面向对象

面向对象之父Alan Kay给我们带来了一种抽象化世界的方法。

一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

因此我们有了面向对象式的编程式范。

函数式

这里本来应该引入《范畴论》的概念,不过在这里引入似乎会把事情搞的更复杂,所以先不去理会它,直接看结果。

世界就是由事物和事物之间的关系构成的

下面是一个空无一物的世界:

 

image.png

世界中有一个a:

image.png

 

世界中有了事物ab,还有他们之间的关系f,即使他们之间没关系也可以用f来表示,只不过f等于null

image.png

 

我们的世界更加丰富了:

image.png

如果我们继续这样画下去我们可以画出一个足够复杂的世界。不过到这里已经足够了。

  • 把关系f作用到a上可以得到b
  • 把关系g作用到b上可以得到c
  • 把关系h作用到a上可以得到c
  • 其中h = g.f

让我们再次进行抽象,抽取他们的共性部分。

 

image.png

所以我们得到了一个结构:a表示事物,f表示关系。把f作用到a上我们就可以得到b

image.png

 

要知道一切真理都是包含在特定的上下文中的(除了这一句)。所以我们的事物a也应该包含在上下文中它才是真正的a,所以我们得到的b也是上下文中的b

image.png

(这张图看起来像是a是印在盒子上的而不是在盒子内部,不要在意这些细节它是在盒子里的)
我们来用一个算式来验证一下模型计算1+2+4的值:

image.png

 

我们再来一个用户登录的模型,用户名和密码长度都大于0的时候才可以登录:

image.png

 

上面的做法和直接写语句有什么不同?

- (BOOL)canLoginUserName:(NSString *)username password:(NSString *)password{
    if (username.length > 0 && password.length > 0) {
        
    }else{
        
    }
}

拆分方式不同,图中拆分成了:

  • username和它的关系length>0,得到结果YES
  • password和它的关系length>0,得到结果YES
  • 两个YES和它的关系&&,得到结果YES

结论:

  • 如果你把世界拆分成,对象你就得到了面向对象
  • 如果你把世界拆分成事物事物之间的关系你就得到了函数式

好了道友们,看到这里你可以怀着愉快的心情关上电脑,闭上眼睛,深呼吸,思考一下如何按照事物事物之间的关系的方式来拆分世界,你就已经掌握了函数式编程的思想。

简单对比

  • 面向对象的世界里我们是把事物抽象成对象,然后通过封装继承多态来演示他们之间的关系。
  • 函数式的世界里把世界抽象成事物事物之间的关系,用这种方式实现世界的模型。

面向对象的编程更有人情味一些更社会化。比如你想要买一辆汽车,想要托人帮忙砍价。恰好你同学的朋友的大表哥的二嫂子在4s店工作。你就需要:

import "同学"
import "朋友"
import "大表哥"
import "二嫂子"

然后再调用二嫂子.砍价();

函数式编程则更“冰冷”一些,像是工厂里的流水线不停的运转,只要你放入材料就可以在出口处拿到产品。而且它对外部环境没有依赖,只需要将流水线搬走就可以在任何地方生产。不需要找同学的朋友的大表哥的二嫂子来帮忙了。


整理了几篇干货资料,有兴趣的道友可以看看:

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: C 函数式编程是一种基于函数的软件开发方法,它强调将计算过程看作一系列数学函数的组合。这样可以避免副作用,使程序更加易于推理和测试。C 函数式编程的思想源于λ演算和数理逻辑。它可以作为一种范被使用,也可以作为一种编程风格。C 函数式编程的实现需要一些高级语言特性,如闭包、高阶函数和延迟求值等。 使用 C 函数式编程可以使代码变得更加简洁、模块化和可重用。函数成为代码的主要构建块,可以通过组合多个函数创建更复杂的功能。由于没有副作用,程序的行为更加可预测和稳定。此外,C 函数式编程还可以提高代码的并发性和并行性。因为函数没有状态,所以多个线程可以同时调用同一个函数。 然而,C 函数式编程也存在一些缺点。比如,在处理大数据或者实时计算时,由于函数式编程的延迟求值,运行效率可能不如命令编程。另外,函数式编程的学习曲线比较陡峭,需要花费一些时间去适应它特有的语法和方法。 总的来说,C 函数式编程是一种非常有用的编程范,可以提高代码的可重用性、可靠性和并发性,但需要花费一些时间去掌握它的语法和方。 ### 回答2: C语言并不是一种函数式编程语言,而是一种面向过程的语言函数式编程语言的特点是将函数作为基本的构建模块,并且避免使用可变状态和副作用。 在C语言中,我们可以使用函数指针来实现一些函数式编程的思想,但这种方与纯函数式编程语言有很大的区别。C语言函数指针可以作为参数传递给其他函数,也可以作为返回值返回。这使得我们可以实现一些高阶函数,比如map、reduce等。 C语言函数指针还可以用来实现回调函数,这在一些异步编程场景中非常常见。例如,我们可以将一个函数指针作为参数传递给一个异步函数,在异步操作完成后调用该函数指针来传递结果。 总之,虽然C语言并不是一种纯函数式编程语言,但它仍然可以借鉴一些函数式编程思想来实现一些高级的功能。C函数式编程pdf可以作为一个参考资料,帮助我们更好地理解和应用这种编程范。 ### 回答3: C 函数式编程是使用 C 语言实现的一种函数式编程风格的方。与传统的命令编程不同,函数式编程强调纯函数,即没有副作用的函数,每次对相同的输入都会返回相同的输出。 C 函数式编程主要依靠函数指针和递归实现。函数指针可以将函数作为参数传递给其他函数,使得函数具有更高的灵活性。而递归则是一种重要的函数式编程技术,可以将复杂的问题分解为简单的子问题,让代码更加简洁和易懂。 C 函数式编程的优点在于可以编写更加简洁、可维护、可复用的代码,提高开发效率。特别是在并发编程方面,函数式编程可以避免常见的线程安全问题,提高程序的性能。 学习 C 函数式编程需要对函数式编程的基本概念有一定的了解,并熟悉 C 语言函数指针和递归。可以通过阅读相关书籍或在线教程来学习和掌握这种编程方。常用的函数式编程工具包括 Haskell、Scala、Clojure 等,在学习过程中可以结合使用这些工具来深入理解函数式编程的核心思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值