本博客所有内容是原创,未经书面许可,严禁任何形式的转载。
http://blog.csdn.net/u010255642
10、类型
1)初识类型
Haskell是静态类型系统,在编译器就已经确定,这样更利于生成安全的代码,每个表达式都有类型,
使用:t取得某表达式的类型
Prelude> :t (124,"124")
(124,"124") :: Num t => (t, [Char])
Prelude> :t 4234
4234 :: Num a => a
Prelude> :t 'a'
'a' :: Char
Prelude> :t "abc"
"abc" :: [Char]
Prelude> :t True
True :: Bool
::的前面是表达式,后面是类型
字符的类型是Char,字符串的类型是元素为字符的列表,而True和False的类型是Bool,元组是有类型的,比如说下面2个元组的类型不一样:
Prelude> :t (123,"123")
(123,"123") :: Num t => (t, [Char])
Prelude> :t (123,123)
(123,123) :: (Num t1, Num t) => (t, t1)
函数也有类型
比如这个函数
mystr="hello,haskell"
我们用:t输出它的类型:
*Main> :t mystr
mystr :: [Char]
*Main> :t myabs
2)类型类
类型类定义一组函数,这些函数依赖于所给定的数据的类型可以有不同的实现,类型类是Haskell中最强大的特性之一,它可以让你定义一个泛型接口,来给很多不同类型提供一个通用的特性集。
myabs x = if x>0
then x
else -x
mylength jh=sum[1|_<-jh]
oddcount jh=sum[1|x<-jh,x `mod` 2/=0]
evencount jh=sum[1|x<-jh,even x]
上面的几个函数的类型:
*Main> :t mylength
mylength :: Num a => [t] -> a
*Main> :t oddcount
oddcount :: (Integral a1, Num a) => [a1] -> a
*Main> :t evencount
evencount :: (Integral a1, Num a) => [a1] -> a
a、t、a1等都是类型变量,可代表任何一个类型。
“->”将参数和返回值进行分隔,从左到右依次为参数和返回值。
“=>”表示左边的是一个类型约束,每个类型变量都有一个约束的类型,mylength的a变量它的类约束为Num,a是Num这个类的成员,受这个类型所能拥有的操作的约束,而evencount的a1变量能进行Integral类的操作。
再比如,“==”和“/=”的类型类为Eq,变量a支持Eq类的操作,是 Eq类的成员
*Main> :t (==)
(==) :: Eq a => a -> a -> Bool
*Main> :t (/=)
(/=) :: Eq a => a -> a -> Bool
下面是一些常用类型:
Int-integer的标准类型,int有上限和下限。
Integer-与int的差别在于integer没有界限,可使用非常大的数字,大整型。
Float-单精度符点数
Double-双精度符点数
Bool-布尔型
Char-字符,字符列表组成了字符串