这可能是一个非常基本的问题,但似乎还未在SO上涉及。
最近我开始学Haskell,到目前为止类型声明主要包括以下内容:
Int
Bool
Float
etc, etc
现在我要介绍列表,看到了使用a
的类型声明,比如下面这个函数遍历关联列表:
contains :: Int -> [(Int,a)] -> [a]
contains x list = [values | (key,values)<-list, x==key]
有人能解释一下这个 a
是什么以及它是如何工作的吗?观察后发现它似乎代表了每一种类型。这是否意味着我可以将任何类型的列表作为参数输入?
a
并不是特殊的:任何小写标识符都意味着它。它是一个类型 变量,在同一个签名中可以存在多个不同的类型变量。例如,const :: a -> b -> a
接受两个参数,每个参数的类型可以是任意类型,并返回与其第一个输入相同类型的值。 - amalloyf :: [a] -> [a]
不能在其输出中产生任何不在其输入中的东西,因为它是“通用的”。例如f [1,2]
不能产生[2,3]
。同样地,你的contains
函数也无法输出任何新的内容,你可以从类型上看出来,甚至不需要查看代码。 - chi