为什么类型是[tail, init, reverse],[[a] -> [a]]?

ham*_*rns 2 haskell

这个问题是 Haskell 教科书练习中的一个,不是那么聪明的问题。

问题:下列值的类型是什么?

[tail, init, reverse]
Run Code Online (Sandbox Code Playgroud)

解决方案:[[a] -> [a]]

但为什么?

Ser*_*bov 7

tailinitreverse是在通用列表 上定义的函数[a]。您读[a]作“抽象为”的任何类型的列表a,特别是,如果a = Int,您得到[Int]- 整数列表。

现在,接受一个列表并输出相同类型列表的函数具有签名[c] -> [c]或,if c = a, [a] -> [a]。只要两边都有相同的后者,拾取的字母并不重要,因为这意味着您以某种方式获取s[a] -> [b]列表并将其映射到 s 列表- 一般来说 - 不同的类型。你可以这么说,因此你必须映射到任何地方;你也可以说,这样就减少了这种情况。aba = Intb = StringIntStringb = a[a] -> [a]

最后一个:[tail, init, reverse]显然是另一个列表,其中a = [b] -> [b]. 所以你得到了[ [b] -> [b] ]类型 or ,等效地,[ [a] -> [a] ][ [k] -> [k] ]。再次强调:只要您坚持选择的字母,特定的字母并不重要。