这个问题是关于Haskell编程语言的类型。
当我打字时
:t []
我得到的回报是:
[] :: [a]
什么是[a]
?
这样重写可能会让事情更清楚:
[] :: forall a. [a]
因此,由于它不包含任何值,Haskell无法决定类型并将其保持打开状态。但是,如果在类型化表达式中使用它,例如
x = []
f :: [Int] -> [Int]
f l = l
y = f x
它会自动解析为 [Int]
,因为它用作此类型。
这是一个占位符。这基本上意味着任何类型的都可以去那里。换句话说,如果你有一个函数
someFunc :: [Int] -> ()
你可以[]
传递给它,因为[]
是[a]
的,这将匹配[Int]
(通过将a
占位符替换为具体的Int
类型)。
现在,如果您查看,例如,id
,您会发现它具有a -> a
的类型。这意味着它是一个函数,它接受任何类型的对象,并返回相同类型的对象。有趣的是,由于该函数对给定的对象一无所知(因为它对类型没有约束),因此您知道此函数必须执行以下两项操作之一:
- 返回输入对象,或
- 返回⊥(底部)。