[Haskell] 初识Functional Programming

来源:互联网 发布:hidpi canvas.min.js 编辑:程序博客网 时间:2024/05/05 22:26

 最早听说函数式编程是大一时候看一本过期一两年的程序员杂志,在旧杂志摊位十块钱买三本那种。当时懵懵懂懂不理解也硬着头皮看,记得很深的有一句话:“现在的程序员应该多接触不同范式的编程语言,而国内太多学生还在死啃c++和java”。刚好这学期,之前教我们数据结构算法的乔海燕老师开了门haskell函数式编程的公选课,我决定认真学一学。这里把课堂学习的心得简单写下。

 

 

什么是函数式语言编程? 

C, Java, Ada and Pascal 是命令式( imperative )语言: 一个程序时一些命令的序列,程序运行时命令按顺序执行。关注的焦点: 如何 进行计算.
一个函数程序定义了如何将输入数据转换为输出数据,它是一个表达式:程序的运行通过计算表达式实现。关注焦点: 计算什么. (Let the machine do machine’s work and let the human do human’s work. )
函数程序设计基于一种不同于其他程序设计语言的程序观:一个程序是从输入到输出的函数,程序的执行是表达式的计算,而非命令的执行。

 

 

一个简单的例子:求1到10的和

 

 

我觉得整节课最能吊起我胃口的就是接下来这一段代码,相信很多c程序员看了都会为之惊叹! 太优美了。haskell写的快速排序:

 

 

相比之下,c++起码要十几行吧:

 

这是其优美简洁、容易理解的特点。

 

除此以外还有无副作用、强类型、代码重用、模块化、高阶函数,惰性计算等特点。

 

此处的惰性计算(lazy evaluation) 应该是指与c++ java等语言相对的严格计算(strict)

____“在一个严格的语言中,每一表达式,无论其计算结果是否重要,都会得到计算”——《YAHT》

 

详细的介绍可以查阅一篇文章: “Why functional programming matter?”

 

 

函数的定义:

 

 

在数学上,函数应用通常表示为函数名后接包含在括号内的参数,如f(x, y), f (2, 4). 在Haskell中, 函数应用表示为函数名后接依次用空格分隔的参数,如,f x y, f 2 4.
 在Haskell中, 括号用于组织表达式,如           f 2 (2 + 2)
函数应用比其他运算符具有更高的优先级,如 f  2  + 4 等价于    (f  2) + 4

 

 

接下来老师就带着我们写第一个haskell的程序,这里用的解析器是hugs,主要用于教学。另一款也是最常见的是GHC(Glasgow Haskell Compiler)

 

 

 

 

在hugs下运行

 

 

 

 

其中第一次用square溢出了,不过当我把程序中的int改为integer后,那整数简直就是无限大了Q Q 如下图

 

 

最后随便试了试2的xx次方,太大了就会卡住= =  不过这种瞬间输出的快感还是灰常棒!

 

 

 

 

 

 

 

 

 

最后整理一下来自O‘Reilly的 Real World Haskell中的网络资源,方便以后用。

 

The Haskell hierarchical libraries reference

 http://www.haskell.org/ghc/docs/latest/html/libraries/

 

GHC Documentation  包括了User's Guide  Librariex   GHC API  和 Cabal

http://www.haskell.org/ghc/docs/7.0-latest/html/

 

超有个性的Hoogle也Hayoo   两个Haskell API搜索引擎

http://www.haskell.org/hoogle/

http://holumbus.fh-wedel.de/hayoo/hayoo.html

 

 

Haskell98 Report 貌似是语言规范描述

http://www.haskell.org/onlinereport/

 

The Haskell wiki

http://www.haskell.org/haskellwiki/Applications_and_libraries

 

 

Community:

 

the Haskell website

http://www.haskell.org/haskellwiki/Haskell

 

weekly news

http://sequence.complete.org/

 

 

 

 

 

 

 

原创粉丝点击