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中,大写类型是具体类型(Int
、Bool
)或类型构造函数(Maybe
、Either
),而小写类型是类型变量。一个函数在它使用的所有类型变量中都是隐式泛型的,所以:
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>>);
当然,在这些语言中,泛型类型变量通常被称为T
、U
、V
,而在Haskell中它们通常被称为a
、b
、c
。这只是约定俗成的不同。
* 此语法由 GHC 中的 -XExplicitForAll
标志以及其他扩展启用。
这可能是一个非常基本的问题,但是,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中,大写类型是具体类型(Int
、Bool
)或类型构造函数(Maybe
、Either
),而小写类型是类型变量。一个函数在它使用的所有类型变量中都是隐式泛型的,所以:
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>>);
当然,在这些语言中,泛型类型变量通常被称为T
、U
、V
,而在Haskell中它们通常被称为a
、b
、c
。这只是约定俗成的不同。
* 此语法由 GHC 中的 -XExplicitForAll
标志以及其他扩展启用。