haskell及ghc入门使用

时间:2021-05-10 17:06:32

一.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