-->代表输出
1 简单类型,比如:
[code]
:t 'c' --> 'c'::Char
:t "as" --> "as"::String
[/code]
这些都很简单,大家一目了然。
在haskell中,内置的basic type有下面几种
[quote]
Bool,Char,String,int,Integer,Float[/quote]
int和integer的区别就是 int是有限制的比如 int值的范围是 -2^31----2^31-1.而在Integer中他是可以避免大小的限制的,比如2^31::Integer他会给出正确的值。
2 List类型
一个list的类型就是他所包含的元素的类型。比如:
[code]
:t [Flase,True] -->[Bool]
:t [[False],[True]] -->[[Bool]] [/code]
3 Tuple 类型
它和List有所不同,比如有个 Tuple (t1,t2,....tn) 它的类型也就是 (:t t1,...:t tn)
[code]
:t (False,True) --> (Bool,Bool)
[/code]
4 Function类型。
函数的类型也就是匹配输入的类型,和得到的结果的类型。
假设我们有个函数 add 是将两个int型的数字相加。
[code]
:t add --> add:: int->(int->int)[/code]
很奇怪吧,看我做个变换,就不那么奇怪了,这里我用python代码来
[code]
def add(x):
return lambda y: x+y
print add(5)(6)[/code] 比如add函数,当我首先输入一个5时,也就是add(5)它会返回一个函数 lambda y: 5+y, 在haskell中也就是 int->() 这里括号代表一个函数.然后我再输入一个6 后来得到的这个函数就会返回一个int,也就是 (int->int),所以合起来这个函数add的类型也就是int->(int->int)
其实这个也就是lambda算子里面Curring.
5 Ploymorphic 类型
[code]
:t length -->[a]::int
[/code]
这里的 a的意思是指任何类型,也就是说 list里面可以存任何类型的东西.
6 overloaded 类型
比如+或者*,那么所操作的数的类型可以是int,flaot....
[code]
:t +-->Num a=> a->a->a
[/code]
这里还有个要注意的就是在haskell中
类型的推倒是右结合的,比如
a->a->a代表 a->(a->a).
在这里Num是一个class,把它写在a的前面代表 a类型是Num类的实例。(呵呵,很拗口是吧)
一个类型包含一个或者多个类限制,我们就叫overloaded.因此 Num a=> a->a->a是一个overloaded类型.+是一个重载函数.
7 class
在这里说下class提出的动机。
在java,c++等语言中有重载这个机制,比如一个add方法,我们可以通过参数的不同来重载他,比如int型的我们会调用int类型的那个方法,不同的类型我们会调用不同的方法。这个在haskell中,我们使用type class来解决.
在这里先要说一下层次性结构,也就是sicp中很是推崇的一种设计方法,haskell中的type就是这样设计的,value是一层,type是一层,class是一层.
比如haskell中的show类,
[code]
:t show -->(show a)::a->String[/code]
a代表任意类型,而 前面的show代表这个a是show的实例,也就是说所有的基本类型都是show的实例。
在这里 引用lee的一段话:
[quote]
show 和 Ord 这些 class 规定了必须实现的函数
所有继承了这些class 的 子类型,必须实现这些函数
比如 Show 类规定子类必须实现 show 方法
Ord 的子类必须实现 min max 等方法
Num的子类必须实现 + * -等函数....[/quote]
按我的理解class和type的关系就有点像接口和他的实现类的关系,在java中是用重载来实现,而haskell中是用设计一个接口,然后不同的子类型实现不同的函数。(不知道我理解的对不对) 。
1 简单类型,比如:
[code]
:t 'c' --> 'c'::Char
:t "as" --> "as"::String
[/code]
这些都很简单,大家一目了然。
在haskell中,内置的basic type有下面几种
[quote]
Bool,Char,String,int,Integer,Float[/quote]
int和integer的区别就是 int是有限制的比如 int值的范围是 -2^31----2^31-1.而在Integer中他是可以避免大小的限制的,比如2^31::Integer他会给出正确的值。
2 List类型
一个list的类型就是他所包含的元素的类型。比如:
[code]
:t [Flase,True] -->[Bool]
:t [[False],[True]] -->[[Bool]] [/code]
3 Tuple 类型
它和List有所不同,比如有个 Tuple (t1,t2,....tn) 它的类型也就是 (:t t1,...:t tn)
[code]
:t (False,True) --> (Bool,Bool)
[/code]
4 Function类型。
函数的类型也就是匹配输入的类型,和得到的结果的类型。
假设我们有个函数 add 是将两个int型的数字相加。
[code]
:t add --> add:: int->(int->int)[/code]
很奇怪吧,看我做个变换,就不那么奇怪了,这里我用python代码来
[code]
def add(x):
return lambda y: x+y
print add(5)(6)[/code] 比如add函数,当我首先输入一个5时,也就是add(5)它会返回一个函数 lambda y: 5+y, 在haskell中也就是 int->() 这里括号代表一个函数.然后我再输入一个6 后来得到的这个函数就会返回一个int,也就是 (int->int),所以合起来这个函数add的类型也就是int->(int->int)
其实这个也就是lambda算子里面Curring.
5 Ploymorphic 类型
[code]
:t length -->[a]::int
[/code]
这里的 a的意思是指任何类型,也就是说 list里面可以存任何类型的东西.
6 overloaded 类型
比如+或者*,那么所操作的数的类型可以是int,flaot....
[code]
:t +-->Num a=> a->a->a
[/code]
这里还有个要注意的就是在haskell中
类型的推倒是右结合的,比如
a->a->a代表 a->(a->a).
在这里Num是一个class,把它写在a的前面代表 a类型是Num类的实例。(呵呵,很拗口是吧)
一个类型包含一个或者多个类限制,我们就叫overloaded.因此 Num a=> a->a->a是一个overloaded类型.+是一个重载函数.
7 class
在这里说下class提出的动机。
在java,c++等语言中有重载这个机制,比如一个add方法,我们可以通过参数的不同来重载他,比如int型的我们会调用int类型的那个方法,不同的类型我们会调用不同的方法。这个在haskell中,我们使用type class来解决.
在这里先要说一下层次性结构,也就是sicp中很是推崇的一种设计方法,haskell中的type就是这样设计的,value是一层,type是一层,class是一层.
比如haskell中的show类,
[code]
:t show -->(show a)::a->String[/code]
a代表任意类型,而 前面的show代表这个a是show的实例,也就是说所有的基本类型都是show的实例。
在这里 引用lee的一段话:
[quote]
show 和 Ord 这些 class 规定了必须实现的函数
所有继承了这些class 的 子类型,必须实现这些函数
比如 Show 类规定子类必须实现 show 方法
Ord 的子类必须实现 min max 等方法
Num的子类必须实现 + * -等函数....[/quote]
按我的理解class和type的关系就有点像接口和他的实现类的关系,在java中是用重载来实现,而haskell中是用设计一个接口,然后不同的子类型实现不同的函数。(不知道我理解的对不对) 。