浏览 5324 次
锁定老帖子 主题:haskell中的类型
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-13
1 简单类型,比如: :t 'c' --> 'c'::Char :t "as" --> "as"::String 这些都很简单,大家一目了然。 在haskell中,内置的basic type有下面几种 引用 Bool,Char,String,int,Integer,Float int和integer的区别就是 int是有限制的比如 int值的范围是 -2^31----2^31-1.而在Integer中他是可以避免大小的限制的,比如2^31::Integer他会给出正确的值。 2 List类型 一个list的类型就是他所包含的元素的类型。比如: :t [Flase,True] -->[Bool] :t [[False],[True]] -->[[Bool]] 3 Tuple 类型 它和List有所不同,比如有个 Tuple (t1,t2,....tn) 它的类型也就是 (:t t1,...:t tn) :t (False,True) --> (Bool,Bool) 4 Function类型。 函数的类型也就是匹配输入的类型,和得到的结果的类型。 假设我们有个函数 add 是将两个int型的数字相加。 :t add --> add:: int->(int->int) 很奇怪吧,看我做个变换,就不那么奇怪了,这里我用python代码来 def add(x): return lambda y: x+y print add(5)(6)比如add函数,当我首先输入一个5时,也就是add(5)它会返回一个函数 lambda y: 5+y, 在haskell中也就是 int->() 这里括号代表一个函数.然后我再输入一个6 后来得到的这个函数就会返回一个int,也就是 (int->int),所以合起来这个函数add的类型也就是int->(int->int) 其实这个也就是lambda算子里面Curring. 5 Ploymorphic 类型 :t length -->[a]::int 这里的 a的意思是指任何类型,也就是说 list里面可以存任何类型的东西. 6 overloaded 类型 比如+或者*,那么所操作的数的类型可以是int,flaot.... :t +-->Num a=> a->a->a 这里还有个要注意的就是在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类, :t show -->(show a)::a->String a代表任意类型,而 前面的show代表这个a是show的实例,也就是说所有的基本类型都是show的实例。 在这里 引用lee的一段话: 引用 show 和 Ord 这些 class 规定了必须实现的函数 所有继承了这些class 的 子类型,必须实现这些函数 比如 Show 类规定子类必须实现 show 方法 Ord 的子类必须实现 min max 等方法 Num的子类必须实现 + * -等函数.... 按我的理解class和type的关系就有点像接口和他的实现类的关系,在java中是用重载来实现,而haskell中是用设计一个接口,然后不同的子类型实现不同的函数。(不知道我理解的对不对) 。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-13
"""其实这个也就是lambda算子里面Curring."""
Curry 算子就是这个意思。不过真正用其它语言理解起来,不是像你写的 Python 代码那样,那个例子只能作入门教程。 """在这里Num是一个class,把它写在a的前面代表 a类型是Num类的实例。""" 这话说的...你说 a 是实例,这太有歧义了,因为 a 从来就没有存在过;我觉得,最好叫做“举例”。 """这里的 a的意思是指任何类型,也就是说 list里面可以存任何类型的东西.""" 这个不知道是你说错话了还是真的不理解,我估计是句子有歧义。List 里绝不能存不同类型的东西。这句话正确的意思应该是:这里的 a 的意思是忽略作为参数的 List 的类型(即所存数据的类型的 List 类型)。 Haskell 对 Polymorphic 的理解是:忽略部分类型信息。多态的本质是忽略。 """按我的理解class和type的关系就有点像接口和他的实现类的关系""" 差不多。Data 说明数据“是什么”,Type 说明数据“有什么”,Class 说明数据“怎么用”。 Haskell 的类很牛,能够和函数式编程无缝合作了;思想很简单:用什么数据,就把什么数据复制出来再用,就是不改变状态。 |
|
返回顶楼 | |
发表时间:2007-06-14
呵呵,第3个是我表达有误。
最后一个,你能详细解释下吗? |
|
返回顶楼 | |
发表时间:2007-06-14
引用 Data 说明数据“是什么”,Type 说明数据“有什么”,Class 说明数据“怎么用”。
Haskell 的类很牛,能够和函数式编程无缝合作了;思想很简单:用什么数据,就把什么数据复制出来再用,就是不改变状态。 PS: 上次这个帖子回得有错误,我把 data 和 type 搞反了。:oops: type 关键字用来指定一个类型是什么样的类型,data 关键字用来指定一个类型由哪些部分组成,class 用来指定类型的这些部分可以怎么用,有什么行为。 普通的面向对象中的“对象”是真正“活着的对象”,有行为有状态;而 Haskell 中的对象是“死的对象”,没有行为,行为由 class 指定,没有状态,因为 data 定义的数据的域不可被更新,所以对象事实上只是数据的提供者。理解了这个就好办了——函数式编程不就是想“以不变应万变”吗?那我根据程序的需要把 data 中的域上的基本类型(或者 type 所定义的)数据复制出来再访问,访问完了在以返回的“新”数据填充一个新“data”不就达到目的了吗? |
|
返回顶楼 | |