Haskell趣學指南--这个有意思
正在慢慢了解不同于命令式的函数式语言。
希望能获得新的视野。。
~~~~~~~~~~~
http://learnyouahaskell-zh-tw.csie.org/zh-cn/ready-begin.html
~~~~~~~~~~~~~~~~~~~~~~~~
中文版,从HASKELL的列表中,居然找到了些PYTHON的感觉。。。。只是操作符号不同。。。
List 入门
在 Haskell 中,List 就像现实世界中的购物单一样重要。它是最常用的数据结构,并且十分强大,灵活地使用它可以解决很多问题。本节我们将对 List,字串和 list comprehension 有个初步了解。 在 Haskell 中,List 是一种单类型的数据结构,可以用来存储多个类型相同的元素。我们可以在里面装一组数字或者一组字符,但不能把字符和数字装在一起。
Note: 在 ghci 下,我们可以使用
let
关键字来定义一个常量。在 ghci 下执行let a=1
与在脚本中编写a=1
是等价的。
ghci> let lostNumbers = [4,8,15,16,23,48] ghci> lostNumbers [4,8,15,16,23,48]
如你所见,一个 List 由方括号括起,其中的元素用逗号分隔开来。若试图写 [1,2,'a',3,'b','c',4]
这样的 List,Haskell 就会报出这几个字符不是数字的错误。字串实际上就是一组字符的 List,"Hello" 只是['h','e','l','l','o']
的语法糖而已。所以我们可以使用处理 List 的函数来对字串进行操作。 将两个 List 合并是很常见的操作,这可以通过 ++
运算符实现。
ghci> [1,2,3,4] ++ [9,10,11,12] [1,2,3,4,9,10,11,12] ghci> "hello" ++ " " ++ "world" "hello world" ghci> ['w','o'] ++ ['o','t'] "woot"
在使用 ++
运算符处理长字串时要格外小心(对长 List 也是同样),Haskell 会遍历整个的 List(++
符号左边的那个)。在处理较短的字串时问题还不大,但要是在一个 5000 万长度的 List 上追加元素,那可得执行好一会儿了。所以说,用 :
运算符往一个 List 前端插入元素会是更好的选择。
ghci> 'A':" SMALL CAT" "A SMALL CAT" ghci> 5:[1,2,3,4,5] [5,1,2,3,4,5]
:
运算符可以连接一个元素到一个 List 或者字串之中,而 ++
运算符则是连接两个 List。若要使用 ++
运算符连接单个元素到一个 List 之中,就用方括号把它括起使之成为单个元素的 List。[1,2,3]
实际上是1:2:3:[]
的语法糖。[]
表示一个空 List,若要从前端插入 3,它就成了 [3]
, 再插入 2,它就成了[2,3]
,以此类推。
Note:
[],[[]],[[],[],[]]
是不同的。第一个是一个空的 List,第二个是含有一个空 List 的 List,第三个是含有三个空 List 的 List。
若是要按照索引取得 List 中的元素,可以使用 !!
运算符,索引的下标为 0。
ghci> "Steve Buscemi" !! 6 'B' ghci> [9.4,33.2,96.2,11.2,23.25] !! 1 33.2
但你若是试图在一个只含有 4 个元素的 List 中取它的第 6 个元素,就会报错。要小心!
List 同样也可以用来装 List,甚至是 List 的 List 的 List:
ghci> let b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]] ghci> b [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]] ghci> b ++ [[1,1,1,1]] [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3],[1,1,1,1]] ghci> [6,6,6]:b [[6,6,6],[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]] ghci> b !! 2 [1,2,2,3,4]
List 中的 List 可以是不同长度,但必须得是相同的类型。如不可以在 List 中混合放置字符和数组相同,混合放置数值和字符的 List 也是同样不可以的。当 List 内装有可比较的元素时,使用 >
和 >=
可以比较 List 的大小。它会先比较第一个元素,若它们的值相等,则比较下一个,以此类推。
ghci> [3,2,1] > [2,1,0] True ghci> [3,2,1] > [2,10,100] True ghci> [3,4,2] > [3,4] True ghci> [3,4,2] > [2,4] True ghci> [3,4,2] == [3,4,2] True
还可以对 List 做啥?如下是几个常用的函数:
head 返回一个 List 的头部,也就是 List 的首个元素。
ghci> head [5,4,3,2,1] 5
tail 返回一个 List 的尾部,也就是 List 除去头部之后的部分。
ghci> tail [5,4,3,2,1] [4,3,2,1]
last 返回一个 List 的最后一个元素。
ghci> last [5,4,3,2,1] 1
init 返回一个 List 除去最后一个元素的部分。
ghci> init [5,4,3,2,1] [5,4,3,2]~~~~~~~~~~~~~~~~
doubleMe x = x + x doubleUs x y = doubleMe x + doubleMe y doubleSmallNumber x = (if x > 100 then x else x*2) + 1 doubleSmallNumber' x = (if x > 100 then x else x*2) + 2 conanO'Brien = "It's a-me, Conam O'Brien!"
Haskell趣學指南--这个有意思的更多相关文章
- [2017.02.21] 《Haskell趣学指南 —— Learning You a Haskell for Great Good!》
{- 2017.02.21 <Haskell趣学指南 -- Learning You a Haskell for Great Good!> [官网](http://learnyouahas ...
- 《Haskell趣学指南》
<Haskell趣学指南> 基本信息 原书名:Learn You a Haskell for Great Good!: A Beginner's Guide 原出版社: No Starch ...
- [2017.02.21-22] 《Haskell趣学指南 —— Learning You a Haskell for Great Good!》
{- 2017.02.21-22 <Haskell趣学指南 -- Learning You a Haskell for Great Good!> 学习了Haskell的基本语法,并实现了一 ...
- 《Haskell趣学指南 Learn You a Haskell for Great Good!》-代码实验
doubleMe x = x + x doubleUs x y = doubleMe x + doubleMe y doubleSmallNumber x = then x else x * doub ...
- Haskell 趣学指南 入门笔记(二)
显示类型声明,Haskell是不用定义类型的原因,很像python 想要确定某个表达式的类型 *Main> :t 'a' 'a' :: Char *Main> :t True True : ...
- haskell趣学指南笔记1
网址:http://learnyouahaskell.com/ 中文版:http://learnyouahaskell-zh-tw.csie.org/zh-cn/ready-begin.html 在 ...
- Haskell 参考资料
1.Haskell 中文社区:www.haskellcn.org 2.Haskell 官网: www.haskell.org 3.Haskell 函数查询:www.haskell.or ...
- Haskell解决逆波兰式
摘自<Haskell趣学指南- Learn You a Haskell for Great Good> {- 逆波兰式(revese polish notation, RPN): 操作符出 ...
- haskell学习笔记<1>--基本语法
七月记录:整个七月就在玩,参加夏令营,去遨游.... 八月份需要开始复习,正等书的这个过程突然想起一直没有完成的学习-haskell,所以当前的目标是用haskell制作一个局域网通信的小工具,要求: ...
随机推荐
- Hadoop生态圈技术图谱
当下Hadoop已经成长为一个庞大的体系,貌似只要和海量数据相关的,没有哪个领域缺少Hadoop的身影,下面是一个Hadoop生态系统的图谱,详细的列举了在Hadoop这个生态系统中出现的各种数据工具 ...
- 关于使用百度ueditor时的一些问题
本来这些问题直接在百度贴吧里回答不就完事了,可是好死不死的,百度贴吧里老出现 未知错误,错误号:230274 看来还是算了,自己做一个随笔记录一下好了 关于我们获取里面的内容时,老是会有一个<p ...
- [深入React] 5.MVC
react 是一种典型的MVC框架. 在jquery中,我们都是针对dom编程,由dom事件触发dom改变,MVC三层代码混在一起. 比如点击变颜色 $('#btn').click(function( ...
- Spark的日志配置
在測试spark计算时.将作业提交到yarn(模式–master yarn-cluster)上,想查看print到控制台这是imposible的.由于作业是提交到yarn的集群上,so 去yarn集群 ...
- Qt 域名转成IP
#include <stdio.h>#include <stdlib.h>#include <netdb.h>#include <arpa/inet.h> ...
- Qt install Phonon
sudo apt-get install libphonon-dev phonon-backend-gstreamer
- IIS7 常用模块介绍说明
1.1.0 IIS常用的功能模块介绍: 1) 静态内容:可发布静态 Web 文件格式,比如 HTML 页面和图像文件. 2) 默认文档:允许您配置当用户未在 URL ...
- hdu 1076
水题 AC代码: #include <iostream> using namespace std; int main() { int i,k,t,y,n; cin>>t; wh ...
- 网页调用QQ聊天
把下面的复制到地址栏里,QQ号为你要聊天的人的qq号,如果你没有登录你自己的qq,首先会调出qq登录窗体. tencent://message/?uin=QQ号
- HTML5 Canvas图像放大、移动实例1
1.前台代码 <canvas id="canvasOne" class="myCanvas" width="500" height=& ...