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

Bol*_*boa 5 haskell type-declaration

这可能是一个非常基本的问题,但是,它似乎没有涵盖在SO上.

我最近接受了Haskell,直到现在,类型声明主要包括以下内容:

Int
Bool
Float
etc, etc
Run Code Online (Sandbox Code Playgroud)

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

contains :: Int -> [(Int,a)] -> [a]
contains x list = [values | (key,values)<-list, x==key]
Run Code Online (Sandbox Code Playgroud)

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

psm*_*ars 12

是的,你是对的,它代表"任何类型" - 限制是a指定类型签名中的所有s必须解析为相同类型.因此,您可以输入任何类型的列表,但是当您使用contains查找列表中的值时,您查找的值必须与列表中的元素的类型相同 - 这当然是有意义的.

  • 同样重要的是,`a`并不特别:*任何*小写标识符意味着.它是一个类型*变量*,并且可以在同一个签名中存在多个不同的类型变量.例如,`const :: a - > b - > a`接受两个参数,每个参数都是任何类型,并返回一个与第一个输入类型相同的值. (8认同)
  • @Bolboa实际上,例如一个函数`˚F::并[a] - >并[a]`不能在它的输出任何东西,其不存在于它的输入产生的,因为它是"通用的".例如`f [1,2]`不能产生`[2,3]`.类似地,你的`contains`函数不能输出任何新的东西,你可以从类型中看到它,甚至没有查看代码. (4认同)
  • 我看,它非常通用.所以,我猜,在大多数情况下,`a`通常代表我的函数没有真正使用或更改太多的元素. (2认同)
  • @Bolboa:是的,它与其他语言中的“泛型”概念密切相关。是的,如果类型完全是通用的,那么您几乎无法直接对其值本身执行任何操作。Haskell 确实有一种方法可以提供有关类型的更多信息(例如,“可以比较相等性”、“可以打印”、“可以像数字一样对待”),它允许您对值进行更多处理; 如果您对此感兴趣,请在文档或教程中查找“类”。 (2认同)