




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Haskell中的类型与类型系统编程语言分类编程语言Domain SpecificLanguage(特定领域语言)General Purposeprogramminglanguage(通用编程语言)SQL, HTML命令式语言命令式语言C/C+, Java,Python, C#混合范式型语言混合范式型语言Scala, OCaml, F#函数型语言函数型语言Haskell, Coq,Agda, Lisp,Clojure, ML什么是Haskell?一个强类型的、纯的、惰性的函数式编程语言一个强类型的、纯的、惰性的函数式编程语言第一个编译器的版本于第一个编译器的版本于1990年年4月发布月发布每年
2、有相当多的博士在改进它,进化速度非常快每年有相当多的博士在改进它,进化速度非常快see 什么是Haskell?每个值都有严格的类型,不能任意转型,也没有隐式转型。对于纯函数只要输入确定结果必然确定,与计算机当前的状态无关。Haskell可以严格求值,7.10前需要我们手动控制,但7.12中会有-XStrict扩展演示用SMT Solver解百鸡问题公鸡每只5元,母鸡每只3元,小鸡3只1元,用100元钱买100只鸡,求公鸡、母鸡、小鸡各有多少只。函数反应式编程模拟小球下落函数/运算符(位置、结合性、优先级)值Haskell中的主要概念Kind(多态kin
3、d、实体kind、data kind)类型(多态类型、类型类限定类型、实体类型)类型类Haskell中的值1, True函数函数not : Bool - Boolid : a - ashow : Show a = a - String运算符只是有优先级的函数,它们可以相互转化运算符只是有优先级的函数,它们可以相互转化(+) 1 2与与1 + 2相同相同mod 19 7与与19 mod 7相同相同Haskell中的类型基本类型:基本类型:Int, Integer, Char, type String = Char基于基本类型的函数基于基本类型的函数ord : Char - Intchr : In
4、t - Char多态类型:多态类型:a, Maybe a, (a,b)多态类型函数:多态类型函数:id : a - a,const : a - b - alength : a - Intsize : Tree a - Intfst : (a,b) - a所以的值都有精确的类型,所以的值都有精确的类型, 1 : Char, True : Bool代数类型枚举类型枚举类型data Bool = False | Truederiving (Eq, Show, Ord, Enum, Bounded, Read)参数化类型参数化类型类似于类似于Java中的泛型中的泛型data Maybe a = Not
5、hing | Just aderiving (Eq, Show, Ord, Read)- 解决了解决了Tony Hoare的十亿美元的的十亿美元的null问题问题!递归类型递归类型data Nat = Zero | Succ Natderiving (Eq, Show, Ord, Read)构造类型构造类型data Pair a b = Pair a b- 类型构造器与数据构造器名字一样类型构造器与数据构造器名字一样data Person = Person name : String, age: Intdata List a = Nil | Cons a (List a)- data a =
6、| a : aderiving (Eq, Show, Ord, Read)基于这些类型的函数每个模式实际上是匹配的构造器与参数。每个模式实际上是匹配的构造器与参数。not : Bool - Boolnot False = Truenot True = FalsefromJust : Maybe a - afromJust (Just x) = xfromJust Nothing = error “cannot get value from nothing”error的类型是什么?的类型是什么?基于这些类型的函数每个模式实际上是匹配的构造器与参数。每个模式实际上是匹配的构造器与参数。not :
7、Bool - Boolnot False = Truenot True = FalsefromJust : Maybe a - afromJust (Just x) = xfromJust Nothing = error “cannot get value from nothing”error的类型是什么?的类型是什么?error : String - a基于这些类型的函数add : Nat - Nat - Natadd Zero n = nadd (Succ n) m = add n (Succ m)foo : Person - Stringfoo (Person n s) = n + if
8、 s 18then “ is an adult”else “ is a child”sum : Int - Intsum = 0sum (x:xs) = x + sum xs类型类相当于多种类型的公共属性相当于多种类型的公共属性(=) : Eq a = a - a - Bool类型类间的有依赖关系类型类间的有依赖关系class Eq a = Ord a(=),(),(=),( a - a - Boolshow : Show a = a - String函数的重载函数的重载(+) : Num a = a - a - aInt, Integer, Double, Float都可相加都可相加Show
9、, Eq, Ord, Enum, Read, Bounded定义类型类class Eq a where(=) : a - a - Bool(/=) : a - a - Bool(=) x y = not (x /= y)(/=) x y = not (x = y)-# MINIMAL (=) | (/=) #-class Show a whereshow : a - Stringdata Person = Person Name Intinstance Eq Person where(Person n1 i1) = (Person n2 i2) = n1 = n2 & i1 = i2i
10、nstance Show Person whereshow (Person name age) = name + show ageFunctor函子类型类中的fmap函数data List a = Nil | Cons a (List a)class ListT e = null;List list = null;data Tree a = Leaf | Node a (Tree a) (Tree a)list : List Intlist = Cons 10 (Cons 11 (Cons 6 (Cons 1 Nil)tree : Tree Inttree = Node 10 (Node 11
11、 Leaf Leaf) (Node 6 (Node 1 Leaf Leaf)Leaf)Functor函子类型类中的fmap函数class Functor f wherefmap : (a - b) - f a - f binstance Functor List wherefmap f Nil = Nilfmap f (Cons a l) = Cons (f a) (fmap f l)instance Functor Tree wherefmap f Leaf = Leaffmap f (Node v l r) = Node (f v) (fmap f l) (fmapf r)可以使用可以使用
12、DeriveFunctor编译器扩展自动生成编译器扩展自动生成数学对于Functor的指导意义F(g) F(f) = F(g f)fmap g . fmap f = fmap (g.f)fmap g (fmap f v) = fmap (g.f) v-# RULE “fmap”forall g f v fmap g (fmap f v) = fmap (g.f) v #-fmap (+10) (fmap (*2) 1.10) = fmap (+10).(*2) 1.10int arrfor(int i = 0 ; i arr.length; i+)arri = arri * 2;for(int
13、 i = 0 ; i arr.length; i+)arri = arri + 10;类型类与Java的接口的不同1、接口在、接口在Haskell相当于是一个字典,函数调用会根据不同的类型相当于是一个字典,函数调用会根据不同的类型来传递。多几个类型类限定相当于是多传入了几个字典。来传递。多几个类型类限定相当于是多传入了几个字典。Java中要中要把接口合并起来有些啰嗦。把接口合并起来有些啰嗦。2、由于、由于Haskell的类型是代数数据类型,即全部可以用单位元、类的类型是代数数据类型,即全部可以用单位元、类型加法、类型乘法、类型复合来定义,所以类型类实例可以自动实现型加法、类型乘法、类型复合来定
14、义,所以类型类实例可以自动实现能力极强,而且方法特别多能力极强,而且方法特别多通用编程、摒弃模板化编程、元编程。通用编程、摒弃模板化编程、元编程。3、还有很多其他不同。、还有很多其他不同。演示:处理演示:处理JSON数据的数据的aeson库、漂亮打印的库、漂亮打印的generic-pretty库,类型的序列化。库,类型的序列化。interface Show String show (T a);interface Eq boolean eq(T a);interface ShowEq extends Eq, Showclass Person implements Eq, ShowString n
15、ame ; int age;Person(String name, int age) = name; this.age = age;public boolean eq(Person a) return .equals() & this.age = a.age;public String show() return + “ ” + this.age;foo : (Show a, Eq a) = a - a - (Bool, String)类型系统与Java的不同1、Java中没有中没有“高阶泛型高阶泛型” 高阶高阶Kin
16、dclass MkT m ; new Mk()new Mk()2、没有、没有“多态泛型多态泛型” Kind多态多态类型的Kind类型的类型为类型的类型为kind,类型把值分类,类型把值分类,class给类型赋予了属性,给类型赋予了属性,kind把类把类型分类。型分类。*代表一个实体的代表一个实体的kind如:如:3 : Int , Int : *Just 3 : Maybe Int,Maybe : * - *, Maybe Int : *- 只有只有kind为为*的类型下面才有值的类型下面才有值- 没有一个值的类型是没有一个值的类型是Maybe,只有,只有Maybe Int或或Maybe Ch
17、ar等等Either : * - * - * - 同理也没有一个值的类型是同理也没有一个值的类型是Either(,) : * - * - *- 元组类型的构造器元组类型的构造器- RNodea ( (RoseTree a):kind * - *data BinTree a = BLeaf a| BNode a (Pair (BinTree a)- (a,a)data Pair a = MkPair a a:kind Pair* - *高阶Kinddata RoseTree a = RLeaf a| RNode a RoseTree a高阶Kinddata Tree k a = Leaf a|
18、Node a (k (Tree k a)type RoseTree a = Tree atype BinTree a = Tree Pair atype AnnTree a = Tree AnnPair adata Pair a = MkPair a adata AnnPair a = AnnPair String a a:kind Tree(* - *) - * - *Kind多态Typeableclass Typeable a where- a : *typeOf : a - Stringinstance Typeable Int where - Int : *typeOf _ = “Int”Maybe : * - *instance Typeable Maybe where - ?solution:class Typeable2 t wheretypeOf2 : t a - Stringclass Typeable3 t wheretypeOf3 : t a b - String- 显然这个方案不好!显然这个方案不好!Kind多态Typeableclas
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年设备的租赁合同范本
- 新质生产力企业层面
- 市北区新质生产力
- 2025年针对无效合同的识别与处理措施研究
- 2025买卖合同的注意事项
- 2025年房地产经纪人之房地产交易制度政策通关提分题库及完整答案
- 2025年家庭装修质量保证合同
- 大同新质生产力
- 安全生产大检查督查检查表
- 2025绿化项目设计合同范本
- 水产养殖公司合伙人股权分配协议
- 特殊教育导论 课件 第一章 特殊教育的基本概念
- 急救医疗资源整合优化研究
- 《局域网组建》课件
- 牛津译林7A-Unit3、4单元复习
- 专题四“挺膺担当”主题团课
- 国家义务教育质量监测初中美术试题
- 超声波探伤作业指导书
- 课程思政视域下小学音乐教学策略初探 论文
- 智能高速铁路概论-课件-第一章-世界智能铁路发展-
- 群众性战伤救治技术知识考试题库-下(多选、判断题部分)
评论
0/150
提交评论