当前位置:  开发笔记 > 编程语言 > 正文

功能编程和非函数编程

如何解决《功能编程和非函数编程》经验,为你挑选了3个好方法。

在大学的第二年,我们被"教"了Haskell,我对它几乎一无所知,更不用说函数式编程了.

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



1> Kyle Cronin..:

功能语言的一个关键特性是一流功能的概念.这个想法是你可以将函数作为参数传递给其他函数并将它们作为值返回.

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

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

函数式编程有哪些优点?功能编程允许编码具有较少的错误潜力,因为每个组件都是完全隔离的.此外,使用递归和第一类函数可以简单地证明正确性,这通常反映了代码的结构.


@Lazer有几个原因可以解释为什么这是不可取的.首先,如果函数返回相同的结果,那么您可以缓存该结果并在再次调用该函数时返回它.其次,如果函数没有返回相同的结果,那意味着它依赖于程序的某些外部状态,因此该函数不能轻易地预先计算或并行化.
在分析和调试代码时,这也是一个巨大的好处.副作用基本上只是对程序员隐藏的函数的隐式输入.
"这样做的主要原因是对函数的连续调用将产生相同的结果""为什么我们希望对函数的连续调用产生相同的结果.C中事物的方式有什么问题?我从来不明白这一点

2> Jon Harrop..:

什么是函数式编程

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

年长的定义(源自Lisp语言)是函数式编程是关于使用一流的功能,即其中功能像任何其他值处理程序,因此您可以函数作为参数传递给其他函数和函数可以在其返回值之间的返回功能.这最终导致使用更高阶的函数,例如mapreduce(你可能已经听说过mapReduce谷歌大量使用的单一操作,不出所料,它是一个近亲!)..NET类型System.FuncSystem.Action在C#中提供高阶函数.尽管在C#中currying是不切实际的,但是接受其他函数作为参数的函数很常见,例如Parallel.For函数.

更年轻的定义(由Haskell推广)是函数式编程也是关于最小化和控制包括变异在内的副作用,即编写通过组合表达式来解决问题的程序.这通常被称为"纯功能编程".这可以通过称为"纯功能数据结构"的数据结构的完全不同的方法实现.一个问题是将传统的命令式算法转换为使用纯功能数据结构通常会使性能提高10倍.Haskell是唯一幸存的纯函数式编程语言,但是这些概念已经渗透到Linq.NET 等主流编程中.

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

到处.C#中的Lambdas现在已经证明了主要的好处.C++ 11有lambdas.现在没有理由不使用高阶函数.如果您可以使用像F#这样的语言,您还将受益于类型推断,自动泛化,currying和部分应用(以及许多其他语言功能!).

我是否认为C是非函数式编程语言?

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



3> Rob Cooper..:

可能值得在CoDe Mag最近发布的F#"​​101"上查看这篇文章.

此外,达斯汀坎贝尔有一个很棒的博客,他发布了很多关于他的F&F速度的文章.

我希望你找到这些有用:)

编辑:

另外,仅仅补充一下,我对函数式编程的理解是,所有东西都是函数,或函数的参数,而不是实例/有状态对象.但我可能是错的F#是我渴望进入的东西,但只是不有时间!:)

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有