一.haskell语言的特性
1.haskell是纯函数式编程语言,它是引用透明的,没有副作用。haskell的一个函数如果定义了变量a为1,a是不可变的。没有可变的状态带来的好处是函数的调用结果不依赖于外部的状态,也不会修改外部的状态。而且,状态的不可变特性,使得haskell中的多线程变得更容易处理,因为多个线程之间不存在竞态条件,不需要加锁保护共享资源,在多处理器的环境中,haskell更容易发挥并行处理的能力。
2.haskell的求值过程是惰性的。在命令式编程语言中,要对一个数组的所有数据加1,可以遍历这个数组,然后对每个元素加1。连续调用这个函数3次,相当于每个元素的值加3。这个过程需要遍历数组3次,如果数组的数据量庞大,这必然会导致程序运行效率的降低。在haskell语言中,定义一个函数add实现对list所有元素加1,连续调用add函数3次,比如add(add(add(list))),haskell并不会遍历list三次,惰性求值使得它只有在真正需要的时候才会求值,list只会被遍历一次。
3.haskell是静态类型的语言,支持类型推导。比如计算1 + 2或者 1.0 + 2.0,无需指明操作数的类型,haskell会自动推导出类型,这提高了编程的简洁性。
二.haskell编译器ghc
haskell的编译器可以使用ghc,windows,linux以及mac系统对应的版本都可以找到。
ghc包含了ghc编译器和ghci。ghci是交互式的,使用起来很方便。在终端中输入ghci,即会显示Preclude>。可以把ghci当做计算器使用,比如Prelude> 1 + 2
3
Prelude> (+) 1 2
3
Prelude> True && False
False
ghci中定义变量可以使用Prelude> let a = 1
Prelude> a
1
ghci中建立列表可以使用Prelude> let lista = [1, 2, 3, 4],注意列表中的元素的类型必须相同,否则会报错。
Prelude> lista
[1,2,3,4]
如果列表中的元素类型不一致,则会出现以下结果。
Prelude> [1, 2, "h"]
<interactive>:12:2:
No instance for (Num [Char]) arising from the literal ‘1’
In the expression: 1
In the expression: [1, 2, "h"]
In an equation for ‘it’: it = [1, 2, "h"]
也可以使用编辑器写haskell代码。比如使用vim hello.hs新建hello.hs文件,然后在文件中写入
add a b = a + b
这一行定义了一个函数,add是函数名,a和b分别是参数,函数体为a + b
使用ghci敲入命令:load hello.hs和add 1 2
*Main> :load hello.hs
[1 of 1] Compiling Main ( hello.hs, interpreted )
Ok, modules loaded: Main.
*Main> add 1 2
3