4

[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

succ_a「a」と-の間に文字列はないと思いますsucc "a" == succ_a

4

3 に答える 3

16

EnumHaskell では文字列はリストであるため、拡張機能なしで文字列だけのインスタンスを作成することはできないため、リストが にない理由を尋ねることもできます。しかし、それは問題ではありません。問題は、最後に最小の文字を無期限に追加し続けるだけなので、辞書順での列挙はあまり役に立たないことです。

簡単にするためにアルファベットを使用するa..zと、辞書順では最初の文字が繰り返されるだけです。

"", "a", "aa", "aaa", "aaaa", "aaaaa" ...

文字列を列挙するためのより便利な順序は、長さです。このようにして、最初に空の文字列を取得し、次に長さ 1 のすべての文字列、次に長さ 2 のすべての文字列を取得します。

"", "a", "b", ... "z", "aa", "ba", ... "za", "ab", ... "zz", "aaa", "baa" ...

これは基本的に整数の列挙と同じですが、桁が逆になっているため、99 から 100 に到達するのと同じように、"zz"キャリーして getに到達します。"aaa"

Ordただし、これは、辞書編集順序を使用するリストのインスタンスとは矛盾します。

于 2012-04-27T19:24:21.297 に答える
4

免責事項: 私は Haskell についてあまり知りません。

ただし、http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Enumから、Enum は toEnum および fromEnum をサポートして enum 型からInt とまた戻る。これは文字列に対してどのように機能しますか? の場合succ_a = "a" ++ [minBound::Char]、任意の Int がいくつかの が追加された文字列 "a" にマップされminBound::Charます (または、より現実的には、任意の Intが のみを含むnサイズのリストにマップされます)。したがって、「b」はどの Int にもマップされません。nminBound::Char

于 2012-04-27T18:47:03.980 に答える
2

まず、「a」と「aa」が間違っています。

Prelude> "a" < "aA" && "aA" < "aa"
True

「foo」の次の文字列は何ですか? 「ふふ」ですか?「フーア」ですか?「foo\0」ですか?

于 2012-04-27T18:24:12.640 に答える