闲话几句

很丢人,说好的开始写千字文的,但是因为工作原因,最近太忙,每天回到家里都已经很晚了,也就没有胆量开始写一篇文章,一是因为开始写之前需要思考,整理要写的内容,这些都需要花时间,而这会导致的后果就是睡得太晚,影响第二天的工作;二是因为一时间实在想不出要写什么,每天的工作生活千篇一律,工作就是写代码讨论解决方案,然后就是抽一点时间去吃饭,而且吃饭的花样都没什么太大的变化,然后其它的时间都是在上班或回家的路上。所以为了便于坚持,也为了增加点什么,打算现在今天开始学Haskell,然后把学习的过程整理出来,这也算是坚持写作了,然后再在偶尔有灵感的时候写点技术之外的感悟啊之类的,既然不能产出高质量的思想,那就整点也许对一些人有用的干货吧。

关于Haskell

话说Haskell是一种函数式语言,在此之前我接触过Common Lisp,而在我的印象中,属于函数式语言的也只有Lisp及其各种方言,如Clojure、Scheme。当然也曾听说过Haskell语言,不过当时对于这属于哪种类型的语言并不明确,在来到新公司之后,由一同事推荐之后才对这门语言产生了兴趣。

函数式语言对于我的意义,我想更多的应该是在于可以改变一下对于程序的思路,或许换个角度看问题,难题可能也就变成了随手可解的题目了吧。当然,如果能用这语言解决一些实际工作中的问题那就更好了。

开始学习

函数

在Haskell中函数应当由简单小巧的语句组成,简单的逻辑可以尽可能的确保函数无误,然后再由这些小的函数组成一个可以完成完整功能的小函数,这应该是所有函数式语言遵循的原则吧,接受参数并返回处理后结果数据,参数不改变。
下面定义一个简单的函数

1
2
3
maxNum a b = if a > b
then a
else b

如上代码maxNum是函数名,a b是参数,代码简单到不需要进行任何说明,而这也应该是在函数式语言中常见的方法。
在调用时只需要像这样maxNum 15 16调用函数,像这种类型的函数在Haskell叫做前缀式函数,顾名思义,就是指函数名在前,参数在后调用。有了前缀函数自然也就会有其它类型的函数,目前我知道的有中缀函数,即函数在两个参数之间,比如像这样10 + 12,这中间+就是函数,看起来很奇怪吧,但是也还可以接受,在Lisp中(+ 10 12),其实也是属于类似的用法。
另外,可以通过在函数两边使用反引号包围的方法使前缀函数成为中缀函数使用。
还有,函数名中可以存在'符号,一般用在区分分别较小的不同函数,如doubleNumdoubleNum'

比较及IF

Haskell的比较运算我目前了解了这么几个,==、>、>=、<=、<、/=,这里需要注意的是/=,与其它语言明显不同的地方,/=是不等于,这不同于其它语言用!=做为不等于。另外一个需要注意的地方是if,在Haskell中if .. then .. else必须三者同时存在。

列表

对于列表,定义方法是alist = [1,2,3,4,5],合并列表的方法是++,这与其它语言也是完全不一样的,用++合并列表是一种非常低效的操作,在合并之前,此操作会遍历左操作数,比如[1,2,3,4,5] ++ [6,7,8,9,20],此操作会先遍历[1,2,3,4,5],然后再合并[6,7,8,9,10]

当添加新的元素加入列表时,可以用:操作,如9:[1,2,3,4,5],这种操作非常快,但是需要注意的是,要加入的元素必须与列表中原有元素类型相同,否则会报错。可以做如下总结,Haskell的列表中只能保存相同类型的元素,比如[1,2,3,4,5]['a','b'][[1,2], [3,4]]等。

再另外,在Haskell中的字符串其实是字符列表的语法糖,如"hello"等价于['h','e','l','l','o']也与'h':'e':'l':'l':'o':[]相同。

列表的读取

  • length alist 获取列表长度
  • alist!!0 读取列表第一个元素,其中0是要读取元素的索引
  • head alist 读取列表第一个元素
  • tail alist 读取列表除第一个之外所有元素
  • last alist 读取列表最后一个元素
  • init alist 读取列表除最后一个外的所有元素
  • reverse alist 反转列表元素

结束

没想到咱这老胳膊老腿的竟然还是很灵活敏捷的,刚才在倒水的时候发生的一件事,茶壶和杯子都在我的左边,我有常用的有两个杯子,一个用来泡茶一个用来盛温开水睡前喝,这两个杯子中间有个空隙,我一般拿水壶都是从这个空隙拿出来,就在我用左手拿水壶准备倒水泡茶,在通过那个空隙时不小心碰到了外侧那个盛温开水的杯子,就在那个杯子完全脱离桌面往掉的一瞬间,我空着的右手以迅雷不及掩耳盗铃儿响叮当之势从右侧瞬间移动到最左侧稳稳的抓住了那个半空中的杯子,那一瞬间我似乎听到了利器快速划破空气的声音,嘿嘿嘿嘿,宝刀未老啊,虽然之后感觉到头不太舒服,但是还是有点小得意哦,哈哈哈。