Haskell 笔记(三)类型系统

时间:2022-03-04 15:47:06

类型 (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 headhead函数的类型,会显示 head :: [a]->a表示head函数输入是任意变量的List,输出是任意变量。
  • 编写函数的时候好的习惯是先声明函数的类型。

类型接口?类型约束?(Typeclasses)


看到这个名字的时候直接的想法就是类型类,但是这个和OOP中的类没什么关系,你可以把他看成接口,也就是说,凡是属于某个Typeclasses的类型,必须实现该Typeclasses的功能,听上去很绕吧,由于没有接触过函数式编程,所以有些概念和命令式编程对不上,没关系,到后面就理解了,我也不理解。呵呵。

  • Eq相等性判断接口

  • Ord包含可以比较大霄的类型

  • Show可以用字符串表示的类型

  • ReadShow相反

  • Enum成员都是连续的类型

  • Bounded成员都有上限和下限



本教程参考了《Haskell趣学指南》,是这篇指南的学习笔记,不过参入了我自己的一些想法和总结,首先,感谢《Haskell趣学指南》的作者bonus 和大陆翻译者Fleurer和*翻译者MnO2,谢谢你们之前的工作。