Haskell 为什么不是';字符串不是枚举吗?

Haskell 为什么不是';字符串不是枚举吗?,haskell,Haskell,为什么[Char]是Ord的实例,而不是Enum Prelude> let succ_a = "a" ++ [minBound::Char] Prelude> "a" < succ_a True Prelude> succ_a < "a " True Prelude> succ_a < succ_a ++ [minBound::Char] True Prelude>let such_a=“a”+[minBound::Char] 前奏曲>“a”成功a成功

为什么
[Char]
Ord
的实例,而不是
Enum

Prelude> let succ_a = "a" ++ [minBound::Char]
Prelude> "a" < succ_a
True
Prelude> succ_a < "a "
True
Prelude> succ_a < succ_a ++ [minBound::Char]
True
Prelude>let such_a=“a”+[minBound::Char]
前奏曲>“a”<成功
真的
序曲>成功a<“a”
真的
前奏曲>成功a<成功a++[minBound::Char]
真的
我认为“a”和“a”之间没有字符串,所以为什么不把“a”和“aa”分开呢

前奏曲>“a”<“aA”&“aA”<“aA”
真的

“foo”后面的下一个字符串是什么?是“fop”吗?是“fooa”吗?是“foo\0”

免责声明:我对Haskell了解不多


然而,从这一点来看,枚举必须支持toEnum和fromEnum才能从枚举类型转换为Int,然后再转换回来。这对字符串如何工作?如果
succu a=“a”+[minBound::Char]
,则任何Int都映射到一个字符串“a”,并附加一些
minBound::Char
(或者更现实地说,任何Int
n
映射到一个只包含
minBound::Char
)的大小列表上。因此,“b”不会映射到任何Int。

因为字符串是Haskell中的列表,所以您可能会问为什么列表不在
Enum
中,因为您无法为没有扩展名的字符串编写实例。但这并不重要。问题在于,按字典顺序进行的枚举并不是很有用,因为您只是在末尾无限期地附加最小的字符

为了简单起见,使用字母表
a..z
,字典顺序只会让我们重复第一个字母

"", "a", "aa", "aaa", "aaaa", "aaaaa" ...
枚举字符串更有用的顺序是按长度。这样,我们首先得到空字符串,然后是长度为1的所有字符串,然后是长度为2的所有字符串,以此类推

"", "a", "b", ... "z", "aa", "ba", ... "za", "ab", ... "zz", "aaa", "baa" ...
这本质上与枚举整数相同,数字是反向的,因此当你到达
“zz”
时,你携带并得到
“aaa”
,就像从99到100一样


但是,这与使用词典排序的列表的
Ord
实例不一致。

实际上,我可以想到很多介于“a”和“aa”之间的字符串。有“a_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。。无限的。(“u”应该是一个空格,顺便说一句)取点。但是请参见编辑-“a”+[minBound::Char]-即“a\NULL”-即>“a”,并且<这些示例中的任何一个<代码>枚举实例都没有用处。从给定值开始枚举只会产生一个越来越长的
\NULL
字符字符串流,并且不能提出任何
Enum
实例,这与实数不可递归枚举的原因相同。请注意注释
::Char
在这里是不必要的,它将被推断出来。一个更有趣的问题是,为什么列表不是有界的实例,但答案可能是“从来没有人需要这个实例”。实际上,我认为它是
“foo”+[minBound::Char]
"", "a", "b", ... "z", "aa", "ba", ... "za", "ab", ... "zz", "aaa", "baa" ...