在Haskell中[a]是什么类型的?

在Haskell中[a]是什么类型的?,haskell,types,Haskell,Types,这个问题是关于Haskell编程语言中的类型的 我打字的时候 :t [] 我得到的回报是: [] :: [a] 什么是[a]?它是一个占位符。这基本上意味着任何类型的人都可以去那里。换句话说,如果你有一个函数 someFunc :: [Int] -> () 您可以将[]传递给它,因为[]是[a],它将通过用具体的Int类型替换a占位符来匹配[Int] 现在如果你看,比如说,id,你会发现它的类型是a->a。这意味着它是一个函数,接受任何类型的对象,并返回相同类型的对象。有趣的是,由于

这个问题是关于Haskell编程语言中的类型的

我打字的时候

:t []
我得到的回报是:

[] :: [a]

什么是[a]?

它是一个占位符。这基本上意味着任何类型的人都可以去那里。换句话说,如果你有一个函数

someFunc :: [Int] -> ()
您可以将[]传递给它,因为[]是[a],它将通过用具体的Int类型替换a占位符来匹配[Int]

现在如果你看,比如说,id,你会发现它的类型是a->a。这意味着它是一个函数,接受任何类型的对象,并返回相同类型的对象。有趣的是,由于函数对给定的对象一无所知,因为它对类型没有约束,所以您知道该函数必须执行以下两项操作之一:

返回输入对象,或 回来⊥ .
这样重写可能会让事情更清楚:

[] :: forall a. [a]
因此,由于它不包含任何值,haskell无法决定类型并将其保留为打开状态。但是,如果在类型化表达式中使用它,则

x = []

f :: [Int] -> [Int]
f l = l

y = f x

它会自动解析为[Int],因为它被用作此类型。

a称为类型variable@Riccardo我知道。我是否在某个地方错误地表达了自己?一点也不,您只是忘记了指定a的名称:。。。[a]中的a是一个占位符,也称为类型变量。。。[]的类型为[a],将与[Int]匹配。对于新手来说,不精确的书写可能会让人非常困惑