-->代表输出
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中是用设计一个接口,然后不同的子类型实现不同的函数。(不知道我理解的对不对) 。
分享到:
相关推荐
这一章节介绍了Haskell中的几种基本数据类型,包括数值类型、布尔类型、字符类型等。 ##### 4.2 数据类型的声明 解释了如何在Haskell中声明新的数据类型,包括使用`data`关键字定义枚举类型、记录类型等。 ##### ...
在Haskell中,类型系统非常强大且严谨,类型对齐是指在定义数据结构或函数时,确保各个参数或成员的类型一致,以便于编译器和程序员更好地理解和使用。在双端队列的实现中,类型对齐意味着队列的每个操作都应保持其...
通过本章,读者可以了解到Haskell中类型是如何工作的,以及类型类是如何作为接口定义一组类型共享的行为。 ### 第四章:函数的语法 在Haskell中,函数是核心概念之一。这一章深入讲解了模式匹配(Pattern matching...
- **类型类型和类型类(type, type classes)**:解释Haskell中类型系统的概念,包括类型类的使用。 - **列表(lists)**:介绍列表的基本操作和列表推导(list comprehension)。 #### 六、关系 - **关系(relation)**:...
这是一个用于 Haskell 的类型安全的有向无环图库。 这个库在很多方面与其他库不同: 边缘构建是增量的,创建一个“模式”: {-# LANGUAGE DataKinds #-} import Data.Graph.DAG.Edge -- | Edges are statically ...
Haskell语言类型推理的语义模型研究,论文
在Haskell中,类型推断允许开发者编写函数时不必显式声明返回类型,编译器能够自动推断出表达式的类型。这一特性不仅简化了代码,还帮助开发者专注于函数的逻辑。本文将详细介绍如何在Haskell脚本中进行类型推断,并...
safe-printf -- 用于 Haskell 的类型良好、可变参数和灵活的 printf 函数 这是什么? Haskell 的标准Text.Printf模块提供可变参数printf函数但不是类型安全的。 该库为此提供了一种替代方法,更加类型安全的printf...
Haskell 是一种纯函数式编程语言,以其强大的类型系统、惰性求值和静态类型而闻名。它鼓励编写简洁、可读性强且易于维护的代码。本教程将深入探讨 Haskell 的核心概念和语法,帮助初学者理解并掌握这种独特的编程...
《Real World Haskell》是一本广泛认可的Haskell编程语言教程,旨在将这门函数式编程语言的理论与实践相结合,让读者能够在实际项目中运用Haskell。这本书的PDF版本是根据2015年3月1日的在线文档转制而成,确保了...
类型系统在Haskell中非常强大,支持类型推导,使得开发者无需显式声明类型。此外,类型类是一种定义一组操作的方式,这些操作可以在许多不同类型的数据上使用。常见的类型类包括 `Show`、`Read`、`Eq`、`Ord` 等。 ...
GHC是Haskell的主要编译器,提供了许多先进的语言扩展,如类型家族、多参数类型类、通用关联类型等,使得Haskell能够适应各种复杂的编程需求。 9. **Prelude库** Prelude是Haskell的标准库,包含了许多基本的函数...
Haskell有严格的静态类型系统,类型推断能够自动确定变量的类型,无需显式声明。类型系统确保了代码的健壮性,避免了运行时错误。 3. **惰性求值** 惰性求值是Haskell的一大特性,只有在真正需要计算结果时才会...
类型类别是Haskell类型系统的一个核心概念,它允许对类型的值进行参数化和约束,使得同一函数能够适用于不同类型的对象。 用户定义的数据类型包括代数数据类型声明、类型同义词声明和数据类型重命名。代数数据类型...
这一部分涵盖了Haskell中的基本数据类型,如整数(Int, Integer)、浮点数(Float, Double)、字符(Char)和布尔值(Bool)。此外,还可能涉及字符串(String),它实际上是字符的列表。理解这些类型以及它们之间...
在Haskell中,错误通常通过返回`Nothing`(在`Maybe`类型中)或`Left`(在`Either`类型中)来处理。GHCi交互式环境和`ghc`编译器提供了丰富的调试工具。 ### 九、Haskell的应用 Haskell因其卓越的性能和安全性,在...
在Haskell中,类型系统是非常重要的部分。Haskell的类型推导机制能够自动确定函数和表达式的类型,确保程序的类型安全。例如,`Maybe` 类型用于表示可能的缺失值,`Either` 类型用于处理错误,这些都是Haskell处理...
9. **类型级编程**:Haskell允许在类型级别进行编程,这在高级编程技巧中非常有用,例如类型级别的元编程和类型安全的配置。 10. **函数组合**:学习如何通过函数组合来构建复杂的系统,以及如何使用Lens和...