Haskell-(类型声明)什么是"a"?

Haskell-(Type declaration) what is "a"?

这可能是一个非常基本的问题,但是,SO 似乎并未涵盖它。

我最近开始学习 Haskell,到目前为止,类型声明主要包括以下内容:

Int
Bool
Float
etc, etc

现在我进入列表,我看到使用 a 的类型声明,例如在以下迭代关联列表的函数中:

contains :: Int -> [(Int,a)] -> [a]
contains x list = [values | (key,values)<-list, x==key]

谁能解释一下这个 a 是什么,它是如何工作的?从观察来看,它似乎代表了每一种类型。这是否意味着我可以输入任何类型的任何列表作为参数?

是的,你是对的,它代表 "any type" - 限制是给定类型签名中的所有 a 必须解析为同一类型。所以你可以输入任何类型的列表,但是当你使用contains在列表中查找一个值时,你查找的值必须与列表的元素是同一类型——这当然是有道理的.

在Haskell中,大写类型是具体类型(IntBool)或类型构造函数(MaybeEither),而小写类型是类型变量。一个函数在它使用的所有类型变量中都是隐式泛型的,所以:

contains :: Int -> [(Int, a)] -> [a]

是shorthand这个*:

contains :: forall a. Int -> [(Int, a)] -> [a]

在C++中,forall拼写为template:

template<typename a>
list<a> contains(int, list<pair<int, a>>);

在Java和C#中,用尖括号拼写:

list<a> contains<a>(int, list<pair<int, a>>);

当然,在这些语言中,泛型类型变量通常被称为TUV,而在Haskell中它们通常被称为abc。这只是约定俗成的不同。

* 此语法由 GHC 中的 -XExplicitForAll 标志以及其他扩展启用。