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是不同的类型变量,并非特指二者表示的类型不同,这就意味着,在这段类型声明中元组首项的类型与返回值的类型可以相同。
时间: 2024-09-24 06:18:31