Haskell 学习笔记-01:Hello, World!

闲扯函数式编程

函数式编程语言一直是叫好不叫座,用函数式编程语言开发的应用项目并不多。我分析其原因,感觉根本原因在于当今 CPU 的指令体系是面向过程的,换句话讲, C 语言这个家族的编程语言,C++、Java、C#、Delphi 等,是与 CPU 指令体系同构的,因此,用他们写程序,自然很顺手,而且目标代码执行起来效率很高。

说起当今的 CPU 的指令体系,可追溯到图灵机概念的产生。图灵机把数学题是否可求解归结为几个简单的机械动作,所以冯诺依曼根据这一思想建立了现代计算机体系。我大学读的数学专业,大三的时候学习了 Basic 语言,当时感觉眼前一亮,原来数学问题可以这样按照一系列机械步骤求解,当时感觉自己的脑袋就是用来给计算机编程序的,所以当了几年数学老师,最终还是抵挡不住诱惑,辞职做了程序员,一直干到现在。

第一次学 Basic 语言那种眼前一亮的感觉,现在想起来,实际上反映了函数式思维和过程式思维的区别,大学几年学的数学分析、高等代数、微分方程等等,都是函数式思维,忽然有人告诉你可以用 if/then、for、goto 等指令解数学题,你一定感觉到这是外星人文化。实际上,函数式编程是要我们忘记这些面向过程的命令,回归到传统的数学思维模式中来。

为什么要回归数学?有实际价值吗?还是比较容易装B?

我本着实用主义的直觉,感觉在当前冯诺依曼计算机体系下,函数式编程不具备任何优势,因为函数式编程语言与图灵机模型格格不入。函数式编程语言的真正优势,应该会在量子计算时代发挥作用。现在学习函数式编程,一方面可以锻炼一下数学思维,另外或许能在量子计算时代有所作为。当然这只是个猜测,但愿成真。目前阶段,就当 C 语言玩累了,换换脑子放松一下,顺便积累点装B的本钱。

Hello,World!

我的第一个程序,编写了一个 hello 函数,没有参数。代码如下:

hello = "Hello, World!"

运行一下,给出输出:

Prelude>hello
"Hello, World!"

写完这一段程序,我心里暗暗说了句“我靠”,Haskell 真没拿函数当外人,无输入参数的函数和普通变量没啥区别呀?发明 Haskell 这帮大牛们真的很有气质呀!另外,变量这个说法在 Haskell 语言里不知道还存在不存在,边学边体会吧!

练习1 三位数反转

编写函数,输入一个三位整数,输出三位数字翻转后的整数:

inv n = (mod n 10) * 100 + mod (div n 10) 10 * 10 + div n 100

运行一下:

Prelude>inv 123
321

练习2 三个数字排序

给三个数字排序,感觉用 C 语言很简单的算法。代码如下:

    ...
    if (x < y) {t = x; x = y; y = t}
    if (x < z) {t = x; x = z; z = t}
    if (y < z) {t = y; y = z; z = t}
    ...

用 Haskell 写就是下面这个样子:

sortnum3 x y z =
    if y > z then (x, y, z)
    else (x, z, y)

sortnum2 x y z =
    if x >= z then sortnum3 x y z
    else sortnum3 z y x

sortnum x y z =
    if x >= y then sortnum2 x y z
    else sortnum2 y x z

试验一下:

Prelude>sortnum 1 2 3
(3,2,1)

或许利用匿名函数可以简化上面的代码,以后再考虑吧。这就是我写的最复杂的函数式程序了。如果哪位有更好的解法,请告诉我,让我也长长见识,哈哈!

猜你喜欢

转载自blog.csdn.net/quicmous/article/details/80626435