这个问题是 Haskell 教科书练习中的一个,不是那么聪明的问题。
问题:下列值的类型是什么?
[tail, init, reverse]
Run Code Online (Sandbox Code Playgroud)
解决方案:[[a] -> [a]]
但为什么?
tail、init和reverse是在通用列表 上定义的函数[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] ]。再次强调:只要您坚持选择的字母,特定的字母并不重要。