首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数式编程和非函数式编程

函数式编程和非函数式编程
EN

Stack Overflow用户
提问于 2008-08-23 14:58:12
回答 7查看 30K关注 0票数 72

在我大学的第二年,我们被“教”了Haskell,我对它几乎一无所知,对函数式编程更是一无所知。

什么是函数式编程,为什么和/xor我想在哪里使用它而不是非函数式编程,我认为C是一种非函数式编程语言是正确的吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-08-23 15:19:17

函数式语言的一个关键特性是第一类函数的概念。其思想是,您可以将函数作为参数传递给其他函数,并将它们作为值返回。

函数式编程涉及编写不改变状态的代码。这样做的主要原因是,连续调用函数将产生相同的结果。您可以用任何支持一类函数的语言编写函数代码,但是有些语言不允许您更改状态,比如Haskell。事实上,你根本不应该产生任何副作用(比如打印文本)--这听起来可能是完全无用的。

相反,Haskell采用了一种不同的IO方法: monads。这些对象包含要由解释器的顶层执行的所需IO操作。在任何其他级别,它们都只是系统中的对象。

函数式编程有什么优势?函数式编程允许使用较少的潜在bug进行编码,因为每个组件都是完全隔离的。此外,使用递归和一类函数允许简单的正确性证明,这通常反映了代码的结构。

票数 91
EN

Stack Overflow用户

发布于 2013-01-28 00:15:41

什么是函数式编程

目前常用的“函数式编程”有两种不同的定义:

较早的定义(起源于Lisp)是,函数式编程是关于使用一级函数进行编程的,也就是说,将函数视为任何其他值,以便您可以将函数作为参数传递给其他函数,并且函数可以在其返回值中返回函数。这最终导致了mapreduce等高阶函数的使用(您可能听说过mapReduce是谷歌大量使用的单个操作,毫不奇怪,它是谷歌的近亲!)。.NET类型System.FuncSystem.Action使高阶函数在C#中可用。虽然currying在C#中是不切实际的,但接受其他函数作为参数的函数是很常见的,例如Parallel.For函数。

更年轻的定义(由Haskell推广)是,函数式编程也是关于最小化和控制副作用,包括突变,即编写通过组合表达式来解决问题的程序。这通常被称为“纯函数式编程”。这是通过对称为“纯函数数据结构”的数据结构的截然不同的方法来实现的。一个问题是,将传统的命令式算法转换为使用纯函数式数据结构通常会使性能下降10倍。Haskell是唯一幸存下来的纯函数式编程语言,但这些概念已经通过.NET上的Linq等库悄悄进入了主流编程。

我想在哪里使用它而不是非函数式编程

到处都是。C#中的Lambdas现在已经展示了主要的好处。C++11有lambda。现在没有理由不使用高阶函数。如果你能使用像F#这样的语言,你还将从类型推断、自动泛化、汇聚和部分应用程序(以及许多其他语言特性!)中获益。

我认为C是一种非函数式编程语言对吗?

是。C是一种过程化语言。但是,通过在C中使用函数指针和void *,您可以获得函数式编程的一些好处。

票数 24
EN

Stack Overflow用户

发布于 2008-08-23 15:08:21

可能值得查看最近在CoDe杂志上发表的这篇关于F# "101"的文章。

此外,他还在Dustin Campbell has a great blog上发表了许多关于使用F#的冒险经历的文章。

我希望你能发现这些有用的东西:)

编辑:

另外,我对函数式编程的理解是,一切都是一个函数,或者是函数的参数,而不是实例/有状态对象。但我可能错了,F#是我渴望进入的东西,但就是没有时间!:)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档