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

    xiaoxiao2024-08-23  157

    本节书摘来自异步社区《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是不同的类型变量,并非特指二者表示的类型不同,这就意味着,在这段类型声明中元组首项的类型与返回值的类型可以相同。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)