Haskell中为何"Anna" ++ [' ']可行而1 ++ [' ']不可行?
为什么
"Anna" ++ [' ']可行但1 ++ [' ']不行? 核心原因是Haskell里的++操作符有严格的类型要求:它只能用来拼接两个同类型的列表,具体类型签名是[a] -> [a] -> [a]——意思是接收两个元素类型为a的列表,返回一个同样元素类型为a的列表。
先看字符串的情况
在Haskell中,双引号包裹的字符串是字符列表的语法糖:"Anna"等价于['A','n','n','a'],它的类型是[Char](字符组成的列表);而[' ']是一个只包含空格字符的列表,类型同样是[Char]。
这两个值都是同类型的列表,完全符合++的使用规则,所以"Anna" ++ [' ']能正常运行,结果是"Anna "(等价于['A','n','n','a',' '])。
再看数字的情况
1是一个数值类型的值(比如Int或Integer),它的类型根本不是列表。++要求左右两边都必须是列表,你把一个非列表的数值和字符列表放在++两边,类型完全不匹配,编译器自然会报错。
如果想把数字和字符列表拼接,得先把数字转换成字符列表(也就是字符串),比如用show函数:show 1会把1转换成字符串"1",此时show 1 ++ [' ']就变成了两个[Char]类型的列表拼接,结果是"1 ",就能正常运行了。
内容的提问来源于stack exchange,提问作者noentiendo
相关产品推荐
相关产品推荐

