【本文建议有 C/C++ 系语言基础的同学阅读】
首先呢,Haskell 和我们平时经常看见的 C++/Java 和 C 等面向对象和面向过程的语言不同,Haskell 是一门函数式语言.
这意味着很多在面向对象/过程语言上常用的语法在 Haskell 将完全不一样. 例如:Haskell 没有 for 循环. 那有人会问了,在 Haskell 里面连 for 循环都没有,难道要做循环必须使用递归吗?没错,在 Haskell 中,大部分的循环都用带模式匹配(Pattern Matching)的递归来完成. 而且虽然递归在空间和时间复杂度上通常差于相同的迭代算法,但 Haskell 的编译器会很聪明地把可能的递归转化成迭代. 因此,Haskell 的程序在做循环的时候并不比 C/C++ 慢很多,当然也不比 Java 慢.
首先,我们来看一段最简单的 Haskell 函数:
--tutor.hs
plus :: Int -> Int
plus a = a + 1
这个函数很简单,就是把接收到的 Int 类型(注意,在 Haskell 中,类型都以大写字母开头,所以所有函数必须以小写字母开头)加上 1 然后再把值返回。
第一行的
plus :: Int -> Int
告诉编译器,我定义了一个名叫 plus 的函数,这个函数接受一个 Int 参数,并返回一个 Int.
有同学可能会问了:这段程序没有 return 关键字,编译器怎么知道需要返回哪个值?
很简单,Haskell 会把最后一个表达式的值返回. 在这里最后一个表达式是 a + 1,所以 Haskell 会把 a + 1 的值作为返回值返回.