类型 (Type)
Haskell的类型系统式静态类型系统,在编译的时候就知道数据类型,所以不同类型的值运算在编译的时候就会报错,比如用布尔值和整数运算,在C语言中这种运算就不会报错。
- Haskell 支持类型推导
- 使用
:t
命令后跟任何可用的表达式,即可得到该表达式的类型,如:t 'a'
将输出'a'::Char
表示a
是Char型。 -
函数也有类型,编写函数时,给它一个明确的类型声明是个好习惯,参数之间由 -> 分隔,而与回传值之间并无特殊差异。回传值是最后一项,参数就是前三项,比如
addThree :: Int -> Int -> Int -> Int addThree x y z = x + y + z
-
Int
,Integer
都表示整形,Integer
*,可以表示无穷大的数 -
Float
单精度,Double
双精度,Bool
布尔值,Char
字符,[Char],String
字符串 -
a,b,c,d…
等等由字母表示的类型是变量类型,比如:t head
看head
函数的类型,会显示head :: [a]->a
表示head函数输入是任意变量的List,输出是任意变量。 - 编写函数的时候好的习惯是先声明函数的类型。
类型接口?类型约束?(Typeclasses)
看到这个名字的时候直接的想法就是类型类,但是这个和OOP中的类没什么关系,你可以把他看成接口,也就是说,凡是属于某个Typeclasses的类型,必须实现该Typeclasses的功能,听上去很绕吧,由于没有接触过函数式编程,所以有些概念和命令式编程对不上,没关系,到后面就理解了,我也不理解。呵呵。
-
Eq
相等性判断接口 -
Ord
包含可以比较大霄的类型 -
Show
可以用字符串表示的类型 -
Read
与Show
相反 -
Enum
成员都是连续的类型 -
Bounded
成员都有上限和下限
本教程参考了《Haskell趣学指南》,是这篇指南的学习笔记,不过参入了我自己的一些想法和总结,首先,感谢《Haskell趣学指南》的作者bonus 和大陆翻译者Fleurer和*翻译者MnO2,谢谢你们之前的工作。