在大学的第二年,我们被"教"了Haskell,我对它几乎一无所知,更不用说函数式编程了.
什么是函数式编程,为什么和/ xor我想在哪里使用它而不是非函数式编程?我认为C是非函数式编程语言是正确的吗?
功能语言的一个关键特性是一流功能的概念.这个想法是你可以将函数作为参数传递给其他函数并将它们作为值返回.
函数式编程涉及编写不改变状态的代码.这样做的主要原因是对函数的连续调用将产生相同的结果.您可以使用支持第一类函数的任何语言编写功能代码,但有些语言(如Haskell)不允许您更改状态.事实上,你根本不应该产生任何副作用(比如打印文本) - 听起来它可能完全没用.
相反,Haskell采用了不同的IO方法:monads.这些对象包含由解释器顶层执行的所需IO操作.在任何其他级别,它们只是系统中的对象.
函数式编程有哪些优点?功能编程允许编码具有较少的错误潜力,因为每个组件都是完全隔离的.此外,使用递归和第一类函数可以简单地证明正确性,这通常反映了代码的结构.
什么是函数式编程
目前常用的"函数式编程"有两种不同的定义:
年长的定义(源自Lisp语言)是函数式编程是关于使用一流的功能,即其中功能像任何其他值处理程序,因此您可以函数作为参数传递给其他函数和函数可以在其返回值之间的返回功能.这最终导致使用更高阶的函数,例如map
和reduce
(你可能已经听说过mapReduce
谷歌大量使用的单一操作,不出所料,它是一个近亲!)..NET类型System.Func
并System.Action
在C#中提供高阶函数.尽管在C#中currying是不切实际的,但是接受其他函数作为参数的函数很常见,例如Parallel.For
函数.
更年轻的定义(由Haskell推广)是函数式编程也是关于最小化和控制包括变异在内的副作用,即编写通过组合表达式来解决问题的程序.这通常被称为"纯功能编程".这可以通过称为"纯功能数据结构"的数据结构的完全不同的方法实现.一个问题是将传统的命令式算法转换为使用纯功能数据结构通常会使性能提高10倍.Haskell是唯一幸存的纯函数式编程语言,但是这些概念已经渗透到Linq
.NET 等主流编程中.
我想在哪里使用它而不是非函数式编程
到处.C#中的Lambdas现在已经证明了主要的好处.C++ 11有lambdas.现在没有理由不使用高阶函数.如果您可以使用像F#这样的语言,您还将受益于类型推断,自动泛化,currying和部分应用(以及许多其他语言功能!).
我是否认为C是非函数式编程语言?
是.C是一种程序性语言.但是,您可以通过使用函数指针和void *
C 语言获得函数式编程的一些好处.
可能值得在CoDe Mag最近发布的F#"101"上查看这篇文章.
此外,达斯汀坎贝尔有一个很棒的博客,他发布了很多关于他的F&F速度的文章.
我希望你找到这些有用:)
另外,仅仅补充一下,我对函数式编程的理解是,所有东西都是函数,或函数的参数,而不是实例/有状态对象.但我可能是错的F#是我渴望进入的东西,但只是不有时间!:)