Haskell函数式编程之一-语言初体验

如果你是使用面向对像语言进行编程的程序员,那么你应该去了解掌握一门动态语言。而动态语言的魔力之一就是函数式编程。而要学习了解函数式编程,那么haskell是一个不错的选择。

Haskell是是一门纯函数式编程语言(purely functional programming language)。在其世界中函数是第一等对象。并且在haskell中没有赋值,例如你指派a的值为5,然后你无法再给a分配其它的值。所以你不能像命令式语言那样命令电脑“要做什么”,而是通过函数来描述出问题“是什么”。

作为一个纯的函数式编程语言,它支持惰性求值、模式匹配、列表解析、类型类、类型多态……

别着急,让我们慢慢来解开函数式编程的面纱。

安装Haskell

  1. 可以去官网下载安装包进行安装。
  2. mac平台的用户可以通过homebrew进行安装。

在terminal下输入brew install haskell-platform即可。

使用Haskell

安装完毕后haskell platform的解释器GHC就已经在你的电脑上了。GHC可以解释执行Haskell脚本,即后缀名为.hs的文件。你可可以通过在terminal输入ghci进入交互模式。

1
2
3
4
5
6
7
8
9
10
11
twer@bowen-huang:~$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking … done.
Loading package integer-gmp ... linking … done.
Loading package base ... linking … done.
Prelude> 1+2
3
Prelude> 3*4
12
Prelude> 5/1
5.0

关于Haskell的编辑器你可以使用任何喜欢的编辑器:Vim、Emacs、Sublime、TextMate…..我比较喜欢Sublime。因为在Sublime自带Haskell的快捷编译执行。只需要按Ctrl+B来直接运行Scripts脚本。

在ghci交互模式下可以使用:l命令来load一个Haskell脚本,然后就可以调用此脚本中的函数。我们先写一个’Hello world!’程序,然后通过ghci来load和调用.

HelloWorld.hs

1
main = print $ "Hello world!"
1
2
3
4
5
Prelude> :l HelloWorld.hs
[1 of 1] Compiling Main ( HelloWorld.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
"Hello world!"

如果对文件进行了修改,也可以直接通过:r来重新加载文件。

Haskell的基本语法

加减乘除操作

1
2
3
4
5
6
7
8
9
10
Prelude> 1 + 2
3
Prelude> 3 - 1
2
Prelude> 3 * 4
12
Prelude> 5 / 1
5.0
Prelude> 10 / (-5)
-2.0

注意对负数进行操作时要将其用()括起来,否则系统会报错。

判等与比较操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Prelude> 5 == 5
True
Prelude> 10 == 8
False
Prelude> 5 /= 5
False
Prelude> 10 /= 8
True
Prelude> 5 >= 3
True
Prelude> 5 <= 3
False
Prelude> True && True
True
Prelude> True && False
False
Prelude> False || False
False
Prelude> True || False
True
Prelude> not True
False
Prelude> not False
True

控制流转

1
2
3
4
5
Prelude> let isHello x = if x == "Hello" then True else False
Prelude> isHello "Hello"
True
Prelude> isHello "World"
False

注意这里的条件判断中的else是不可以省略的,这样保证条件语句总会返回一个值。所以我们可以将整个if..then..else pattern看做一个表达式。

如果在脚本文件中写的话不需要使用let关键字。并且也可以采用另一个写法。

isHello.hs

1
2
3
isHello x
 | x == "Hello" = True
 | otherwise     = False

|表示或,otherwise关键字表示其它的情况。当然你也可以将这三行代码写成一行,这样也是能够正常运行的。分成三行只是为了更加可读。

还有第三种写法,实际上与面对对象语言中的switch…case语句有些类似。

isHello.hs

1
2
3
isHello x = case x of
 "Hello" -> True
 otherwise -> False

这和第二种写法很类似。其实第二种写法本质上就是case语句,它只是case语句的一个语法糖而已。

另外,在Haskell中是没有各种循环语句的,如果要实现相似的特性当然要使用递归了。

第二节中,我们会讨论这个问题。

时间: 2024-10-29 06:39:03

Haskell函数式编程之一-语言初体验的相关文章

Haskell函数式编程之四-List操作

List在函数式语言中是一个重要的抽象,很多事情离了它就很难做到.函数式语言的鼻祖Lisp名称就来自List processing. Haskell本身也给List操作提供了一系列的操作符以及库函数. 对列表操作的运算符 :将一个元素放置到列表的前端. 1 2 3 4 5 6 7 8 Prelude> 1 : [] [1] Prelude> 2 : [3,4,5] [2,3,4,5] Prelude> 'a' : ['g','h','d'] "aghd" Prelud

《Haskell函数式编程入门》—— 第1章,第1.6节本章小结

本章小结 学习本章后,相信读者对Haskell应该有了大致的了解.GHCi是一个常用的测试代码的工具,希望读者可以花更多的时间来熟悉.细心的读者可能会发现Haskell与C语言编译后可执行文件的大小有很大差异.其实,Haskell使用内存空间和硬盘空间的效率是有些低的,这也是早期函数式编程没有比C一类的语言更流行的原因之一.但是,如今计算机硬件已经发展到内存和硬盘不会像以前那样限制函数式编程语言能力了,在时间和空间的效率上也可以手动或自动调试优化.因此,相信在不久的未来,函数式编程会以它精炼.缜

《Haskell函数式编程入门》—— 第1章,第1.4节.hs和.lhs文件、注释与库函数

1.4 .hs和.lhs文件.注释与库函数GHCi和Hugs可以解析扩展名为.hs和.lhs的文件.两者所写程序在语法上完全相同,它们的差别是.lhs(literate Haskell script)文件是为了能让Haskell的代码生成文档.有效程序代码可以用"大于号(>)"和空格开头.比如: add :: Int -> Int -> Intadd x y = x + y不以大于号和空格开头的内容将被视作注释处理,且注释与代码间必须有一行以上的间隔.还有一些.lhs

Haskell函数式编程之三-纯函数式编程特点

函数式编程的定义是: In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids stateand mutable data. 即:函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了引入状态及可变数据. 它更强调函数的应用,而不像命令式编

《Haskell函数式编程入门》—— 第1章,第1.5节第一个Haskell程序HelloWorld!

1.5 第一个Haskell程序HelloWorld! HelloWorld程序虽然不能完全展示Haskell编程的风格与优势,但学习计算机编程都是从这里开始的.现在写一个HelloWorld程序,当作开始学习Haskell的第一步吧! 文本编辑器中输入: main = putStrLn "Hello,World!" 保存并命名为Helloworld.hs. 这里可以看到,Haskell和C.Java一样,都以一个名叫main的函数作为程序的开始运行的入口.保存代码文件,打开命令行窗口

《Haskell函数式编程入门》——导读

第1章Haskell简介 第1章第1节Haskell的由来第1章第2节Haskell编译器的安装以及编写环境第1章第3节GHCi的使用第1章第4节.hs和.lhs文件.注释与库函数第1章第5节第一个Haskell程序HelloWorld!第1章第6节小结第2章类型系统和函数第3章基于布尔值的函数第4章库函数及其应用第5章递归函数第6章列表内包第7章高阶函数与复合函数第8章定义数据类型第9章定义类型类第10章Monad初步第11章系统编程及输入/输出第12章记录器Monad.读取器Monad.状态

Haskell函数式编程之二-递归

在Haskell的世界中,没有变量赋值,流程跳转,如果要实现一些简单的功能,比如求一个数组中的最大值,都需要借助递归实现. 递归函数的定义: A function may be partly defined in terms of itself. 即如果一个函数的定义中使用了其自身,这个函数就叫做递归函数. 普通递归(traditional recursion) 我们就写一个简单的对数组求和的函数. 1 2 3 sum' :: (Num a) => [a] -> a sum' (x:xs) =

《Haskell函数式编程入门》—— 第1章,第1.3节GHCi的使用

1.3 GHCi的使用 GHCi是一个对函数进行测试与调式的工具,可以导入Haskell源代码文件,然后调用其中的函数.查看函数的信息等.本节先学习如何使用GHCi中的命令来对文件和库进行导入等,再来了解如何在GHCi中调用函数. 启动GHCi后可以看到GHCi的版本,还有导入的库等,可以不用管它们,最后一行会有一个Prelude>提示符,其中Prelude指的是GHCi在运行时一个默认的初始环境.它是一个定义了很多类型与函数的库.启动GHCi后,用户可以不做任何设置而直接使用其中定义的内容.下

Python函数式编程指南(一):函数式编程概述

  这篇文章主要介绍了Python函数式编程指南(一):函数式编程概述,本文讲解了什么是函数式编程概述.什么是函数式编程.为什么使用函数式编程.如何辨认函数式风格等核心知识,需要的朋友可以参考下 1. 函数式编程概述 1.1. 什么是函数式编程? 函数式编程使用一系列的函数解决问题.函数仅接受输入并产生输出,不包含任何能影响产生输出的内部状态.任何情况下,使用相同的参数调用函数始终能产生同样的结果. 在一个函数式的程序中,输入的数据"流过"一系列的函数,每一个函数根据它的输入产生输出.