欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Haskell

最编程 2024-08-04 13:48:28
...

haskell 是一门纯函数式编程语言。在命令式语言中执行操作需要给电脑安排一组命令,随着命令的执行,状态就会随之发生改变。例如你给变量 a 赋值为 5,而随后做了其它一些事情之后 a 就可能变成的其它值。有控制流程,你就可以重复执行操作。然而在函数式编程语言中,你不是像命令式语言那样命令电脑“要做什么”,而是通过用函数来描述出问题“是什么”,如“阶乘是指从1到某数间所有数字的乘积”。变量一旦赋值,就不可以更改了,你已经说了 a 就是 5,就不能再另说 a 是别的什么数。做人不能食言,对不?所以说,函数式编程语言中的函数能做的唯一事情就是求值,因而没有副作用。一开始会觉得这很受限,不过好处也正源于此:若以同样的参数调用同一函数两次,得到的结果总是相同。这被称作“引用透明”。如此一来编译器就可以理解程序的行为,你也很容易就能验证一个函数的正确性,继而可以将一些简单的函数组合成更复杂的函数。

haskell 是惰性的。也就是说若非特殊指明,函数在真正需要结果以前不会被求值。再加上引用透明,你就可以把程序仅看作是数据的一系列变形。如此一来就有了很多有趣的特性,如无限长度的数据结构。假设你有一个 List:xs = [1,2,3,4,5,6,7,8],还有一个函数doubleMe,它可以将一个List中的所有元素都乘以二,返回一个新的List。若是在命令式语言中,把一个 List 乘以 8,执行doubleMe(doubleMe(doubleMe(xs))),得遍历三遍 xs 才会得到结果。而在惰性语言中,调用 doubleMe 时并不会立即求值,它会说“嗯嗯,待会儿再做!”。不过一旦要看结果,第一个 doubleMe 就会对第二个说“给我结果,快!”第二个 doubleMe 就会把同样的话传给第三个 doubleMe,第三个doubleMe只能将 1 乘以 2 得 2 后交给第二个,第二个再乘以 2 得 4 交给第一个,最终得到第一个元素 8。也就是说,这一切只需要遍历一次list即可,而且仅在你真正需要结果时才会执行。惰性语言中的计算只是一组初始数据和变换公式。

haskell 是静态类型的。当你编译程序时,编译器需要明确哪个是数字,哪个是字符串。这就意味着很大一部分错误都可以在编译时被发现,若试图将一个数字和字符串相加,编译器就会报错。haskell 拥有一套强大的类型系统,支持自动类型推导。这一来你就不需要在每段代码上都标明它的类型,像计算 a=5+4,你就不需另告诉编译器“a 是一个数值”,它可以自己推导出来。类型推导可以让你的程序更加简练。假设有个二元函数是将两个数值相加,你就无需声明其类型,这个函数可以对一切可以相加的值进行计算。

haskell 采纳了很多高级概念,因而它的代码优雅且简练。与同层次的命令式语言相比,haskell 的代码往往会更短,更短就意味着更容易理解,bug 也就更少。

haskell 的研发工作始于 1987 年,当时是一个学会的精英分子(很多 PhD 哦)聚到一块儿,商量着要设计一门牛 X 的语言。03 年,《 Haskell Report 》发布,标志着稳定版本的最终确定。

推荐阅读