为什么String不是枚举?

gcb*_*son 4 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
Run Code Online (Sandbox Code Playgroud)

我认为"a"和succ_a- 之间没有字符串- 为什么不succ "a" == succ_a呢?

ham*_*mar 16

由于字符串是Haskell中的列表,因此您可能会问为什么列表不在列表中Enum,因为您无法为没有扩展名的字符串编写实例.但那没关系.问题是按字典顺序排列并不是很有用,因为你只是在最后无限期地追加最小的字符.

使用字母表a..z来简化,词典顺序只是让我们重复第一个字母.

"", "a", "aa", "aaa", "aaaa", "aaaaa" ...
Run Code Online (Sandbox Code Playgroud)

枚举字符串的更有用的顺序是长度.这样,我们首先得到空字符串,然后是长度为1的所有字符串,然后是长度为2的所有字符串,等等.

"", "a", "b", ... "z", "aa", "ba", ... "za", "ab", ... "zz", "aaa", "baa" ...
Run Code Online (Sandbox Code Playgroud)

这基本上与枚举整数相同,数字相反,所以当你到达时,"zz"你可以随身携带"aaa",就像从99到100一样.

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