这个问题是关于Haskell编程语言的类型.
当我输入
:t []
Run Code Online (Sandbox Code Playgroud)
我得到的回报是:
[] :: [a]
Run Code Online (Sandbox Code Playgroud)
什么是[a]?
phi*_*ler 12
像这样重写可能会让事情变得更清晰:
[] :: forall a. [a]
Run Code Online (Sandbox Code Playgroud)
因此,由于它不包含任何值,因此haskell无法决定类型并使其保持打开状态.但是,如果您在类型化表达式中使用它,就像
x = []
f :: [Int] -> [Int]
f l = l
y = f x
Run Code Online (Sandbox Code Playgroud)
它自动被解析为[Int],因为它被用作这种类型.
这是一个占位符.它基本上意味着任何类型都可以去那里.换句话说,如果你有一个功能
someFunc :: [Int] -> ()
Run Code Online (Sandbox Code Playgroud)
你可以通过[]它,因为[]就是[a],将匹配[Int](通过更换a与混凝土占位符Int类型).
现在,如果你看,比方说id,你会发现它有类型a -> a.这意味着它是一个接受任何类型对象的函数,并返回相同类型的对象.有趣的是,因为函数对它给出的对象一无所知(因为它对类型没有约束),你知道这个函数必须做以下两件事之一: