haskell(9)

本博客所有内容是原创,未经书面许可,严禁任何形式的转载。

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-字符,字符列表组成了字符串


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值