【发布时间】:2018-07-04 07:28:28
【问题描述】:
为什么只有一个字母的String尾部是空String而不是空List?
例子:
tail "a"
= ""
但是你可以创建一个字符串为:
'a' : []
= "a"
所以我认为尾部应该是空列表[]。
如果你这样做
tail ["x"]
然后你得到空列表[]。
这有点令人困惑。
【问题讨论】:
为什么只有一个字母的String尾部是空String而不是空List?
例子:
tail "a"
= ""
但是你可以创建一个字符串为:
'a' : []
= "a"
所以我认为尾部应该是空列表[]。
如果你这样做
tail ["x"]
然后你得到空列表[]。
这有点令人困惑。
【问题讨论】:
因为空字符串是Chars的空列表,所以只是shown不同:
Prelude> [] :: String
""
【讨论】:
这是因为空的String 和空的Char 列表是完全相同的东西(type String = [Char])。 Show instance for Char 考虑到这一点并覆盖列表呈现(使用showList)以呈现为字符串。这就是为什么String 没有Show 实例的原因; Show a => Show [a] 处理所有列表并使用showList [Char]。
顺便说一句,文本比一串字符复杂得多。在 C 和 Haskell 中很早就选择了这种近似,但是像 Data.Text 这样的其他实现可能有更好的方法。
【讨论】:
当您定义 Show 类型类的实例时,您可以实现方法 showList,这是该类型列表的显示方式。所以:
showList [] = "" -- I guess this is not the actual implementation, but something similar
问候,
【讨论】: