正在慢慢了解不同于命令式的函数式语言。

希望能获得新的视野。。

~~~~~~~~~~~

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趣學指南--这个有意思的更多相关文章

  1. [2017.02.21] 《Haskell趣学指南 —— Learning You a Haskell for Great Good!》

    {- 2017.02.21 <Haskell趣学指南 -- Learning You a Haskell for Great Good!> [官网](http://learnyouahas ...

  2. 《Haskell趣学指南》

    <Haskell趣学指南> 基本信息 原书名:Learn You a Haskell for Great Good!: A Beginner's Guide 原出版社: No Starch ...

  3. [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的基本语法,并实现了一 ...

  4. 《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 ...

  5. Haskell 趣学指南 入门笔记(二)

    显示类型声明,Haskell是不用定义类型的原因,很像python 想要确定某个表达式的类型 *Main> :t 'a' 'a' :: Char *Main> :t True True : ...

  6. haskell趣学指南笔记1

    网址:http://learnyouahaskell.com/ 中文版:http://learnyouahaskell-zh-tw.csie.org/zh-cn/ready-begin.html 在 ...

  7. Haskell 参考资料

    1.Haskell 中文社区:www.haskellcn.org 2.Haskell   官网:     www.haskell.org 3.Haskell   函数查询:www.haskell.or ...

  8. Haskell解决逆波兰式

    摘自<Haskell趣学指南- Learn You a Haskell for Great Good> {- 逆波兰式(revese polish notation, RPN): 操作符出 ...

  9. haskell学习笔记<1>--基本语法

    七月记录:整个七月就在玩,参加夏令营,去遨游.... 八月份需要开始复习,正等书的这个过程突然想起一直没有完成的学习-haskell,所以当前的目标是用haskell制作一个局域网通信的小工具,要求: ...

随机推荐

  1. Smarty 插件开发

    插件包含了: functions modifiers block functions compiler functions prefilters postfilters outputfilters r ...

  2. sdl2.0示例

    // gcc -o testDrone2_video testDrone2_video.c -lavcodec -lavformat -lswscale -lSDL2// g++ -o testDro ...

  3. CSS3/HTML5实现漂亮的分步骤注册登录表单

    分步骤的登录注册表单现在也比较多,主要是能提高用户体验,用户可以有选择性的填写相应的表单信息,不至于让用户看到一堆表单望而却步.今天和大家分享的就是一款基于HTML5和CSS3的分步骤注册登录表单,外 ...

  4. HDU5266---pog loves szh III (线段树+LCA)

    题意:N个点的有向树, Q次询问, 每次询问区间[L, R]内所有点的LCA. 大致做法:线段树每个点保存它的孩子的LCA值, 对于每一次询问只需要 在线段树查询即可. #include <bi ...

  5. B树——思路、及C语言代码的实现

    0.序 本人现读本科大二,这学期学习数据结构,老师为我们的期末作业布置一道任选题,而我一直以来都有听说B树是一棵挺神奇的树,所以我选择了它,当然更重要的原因是因为B树的难度最高,我喜欢做有挑战性的工作 ...

  6. linux系统下mySQL数据库 备份方法和脚本

    数据库备份1.创建个备份存储目录mkdir /root/backup/2.以下内容写到dbbackup.sh #!/bin/bash cd /data/db_backup/mysqldump -uad ...

  7. 创建多模块maven项目

    有两种方式: 1,new -->maven project-->maven-archetype-quickstart 建完多个独立的project后,手动修改pom文件的packing类型 ...

  8. nginx本地的测试环境添加SSL

    要在本地添加SSL,首先要做的是防火墙是不是放开了443端口,同时,在nginx安装时是不是支持了ssl模块,这个安装网上很容易找到相关资料 防火墙,个人还是用iptables比较直观 先将selin ...

  9. referer报头

    依据客户的到达方式定制页面 referer报头保存了用户是从哪个网站找到到这里来的信息的.如果用户直接输入了页面的地址,浏览器就不会发送referer信息. 5.6.1 创建一个可以根据链接过来的网站 ...

  10. js比较两个日期大小

    //比较两个日期大小 function dateCompare(startDate,endDate){ var aStart=startDate.split('-'); //转成成数组,分别为年,月, ...