《Haskell趣学指南》—— 第2章,第2.3节类型变量

简介: 本节书摘来自异步社区《Haskell趣学指南》一书中的第2章,第2.3节类型变量,作者 【斯洛文尼亚】Miran Lipovaca,更多章节内容可以访问云栖社区“异步社区”公众号查看 2.3 类型变量 有时让一些函数处理多种类型将更加合理。

本节书摘来自异步社区《Haskell趣学指南》一书中的第2章,第2.3节类型变量,作者 【斯洛文尼亚】Miran Lipovaca,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 类型变量
有时让一些函数处理多种类型将更加合理。比如head函数,它可以取一个列表作为参数,返回这一列表头部的元素。在这里列表中元素的类型不管是数值、字符还是列表,都不重要。不管它具体的类型是什么,只要是列表,head函数都能够处理。

猜猜head函数的类型是什么呢?用:t检查一下:

ghci> :t head
head :: [a] -> a

这里的a是什么?是类型吗?想想我们在前面说过,凡是类型其首字母必大写,所以它不是类型。它其实是个类型变量(type variable),意味着a可以是任何类型。

通过类型变量,我们可以在类型安全(type safe))的前提下,轻而易举地编写能够处理多种类型的函数。这一点与其他语言中的泛型(generic)很相似,但在Haskell中要更为强大,更容易写出通用的函数。

使用了类型变量的函数被称作多态函数(polymorphic function)。head函数即为此例,从它的类型声明中可以看出,它的参数类型为任意类型的元素组成的列表,返回的类型也正是该类型。

注意:
在命名上,类型变量使用多个字符是合法的,不过约定俗成,通常都是使用单个字符作为名字,如a,b,c,d...
还记得fst吗?它可以返回一个序对中的首项。查一下它的类型:

ghci> :t fst
fst :: (a, b) -> a

可以看出fst取一个元组作为参数,且返回类型与元组中首项的类型相同。这便是fst能够处理任何类型序对的原因。注意,a和b是不同的类型变量,并非特指二者表示的类型不同,这就意味着,在这段类型声明中元组首项的类型与返回值的类型可以相同。

相关文章
|
2月前
|
存储 程序员 C语言
【c语言】基础数据类型
这篇内容介绍了编程中的数据类型,主要包括常量和变量。常量分为整型、实型(浮点型)、字符型和字符串型。
23 0
|
23天前
|
存储 Rust 编译器
Rust变量与数据类型
Rust变量与数据类型
|
2月前
|
存储 C语言
C语言基本数据类型
C语言基本数据类型
15 1
|
2月前
|
存储 编译器 C语言
C语言的基本数据类型主要包括以下几种
C语言的基本数据类型主要包括以下几种
6 0
|
6月前
|
存储 编译器 Serverless
C语言的内置数据类型以及变量和常量
C语言的内置数据类型以及变量和常量
60 0
|
5月前
|
编译器 Go C语言
go语言基本数据类型和变量
go语言基本数据类型和变量
45 0
|
9月前
|
C语言 C++
【C】C语言数据类型、常量变量的介绍
在C语言中没种数据类型所占的空间大小是不一样的,在这里给大家介绍一个库函数:sizeof,它可以计算每种数据类型所占的空间的大小,我们可以用代码来计算每种类型所占的空间的大小,如下:
|
10月前
|
存储 C语言
C语言变量常量,基本数据类型及数据类型转换详讲(二)
C语言变量常量,基本数据类型及数据类型转换详讲
134 0
|
10月前
|
存储 安全 编译器
C语言变量常量,基本数据类型及数据类型转换详讲(三)
C语言变量常量,基本数据类型及数据类型转换详讲
122 0
|
10月前
|
存储 JavaScript 前端开发
C语言变量常量,基本数据类型及数据类型转换详讲(一)
C语言变量常量,基本数据类型及数据类型转换详讲
140 0