Chap4. Type Basics 类型基础 **坑未填完**

Haskell 是一种强类型的语言,类型系统是学习的重要一步。虽然类型系统学起来很枯燥~~

虽然静态类型检查可以杜绝大部分的错误,但也会给初学者带来很多的挫折感~ (或许这句话应该倒过来说)
haskell具有类型推导的能力,程序中可以忽略类型,编译器会根据语境自动推导出确定的类型。我们在前面看到的例子都是没有指定类型的。程序中明确写明类型是一个比较推荐的做法,可以避免很多错误。
使用haskell官方网站的 hoogle 搜索,通过函数的类型,就可以搜索到函数列表。这在我们不知道一个函数的确切名字,但却知道输入什么类型期待输出什么类型的情况下很有用处。

4.1 Simple Types
系统已经内建了一些简单类型: Int, Double, Char, String, BOOL 等
当所需要的类型不匹配时,会产生错误提示:

*Main> 's' == "S"

:1:7:
Couldn't match expected type `Char' against inferred type `[Char]'
In the second argument of `(==)', namely `"S"'
In the expression: 's' == "S"
In the definition of `it': it = 's' == "S"

我们显式声明一个数据的类型:
5 :: Int
5 :: Double

*Main> :t 5
5 :: (Num t) => t

(留地)

4.2 Polymorphic Types 多态类型
*Main> tail [1..5]
[2,3,4,5]
*Main> tail ["albert", "lee","foo"]
["lee","foo"]

tail 这个函数并不在乎列表中的类型是什么, 一视同仁。C++ 中的范型算法具有同样的思路,haskell中更直观。
tail 函数的类型是 [a] -> [a] a代表 任意 类型,也就是说输入任意类型元素的一个列表,输出为同等类型元素的一个列表。

4.3 Type Classes 类型类
那么我们为什么需要使用类型系统呢?在很多语言中存在函数重载的机制:通过不同的参数类型选择不同的函数处理。一个标准的例子是判断相等的函数,如果是参数是两个Int则调用Int 对应的equal函数,如果是两个String调用则调用String对应的equal函数。在Haskell中使用 Type Class机制来解决这个问题。

4.4

4.5