2012-04-27 21 views
4

なぜ[Char]Ordのインスタンスで、Enumのインスタンスではないのですか?なぜないsucc "a" == succ_a -なぜ文字列は列挙型ではありませんか?

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 

私は "A" とsucc_aの間には文字列がありませんと思いますか?

+0

実際、私は "a"と "aa"の間で多くの文字列を考えることができます。 「a_」、「a__」、「a____」、「a______」...無限の広告があります。 ( "_"はスペースでなければならない、btw) – Ord

+0

ポイントを獲得しました。しかし、 "a" NULLである "a" ++ [minBound :: Char]の編集を参照してください - > "a"であり、<いずれの例でも " – gcbenison

+7

あなたが提案している' Enum'インスタンスは有用ではありません。与えられた値から始まる列挙は '\ NULL'文字のより長い文字列のストリームを生成するだけで、実数値が再帰的に列挙できないのと同じ理由で有用な' Enum'インスタンスは提案できません。 –

答えて

15

文字列はHaskellのリストなので、リストがEnumにない理由を尋ねるかもしれません。なぜなら、拡張子なしの単なる文字列のインスタンスを書くことができないからです。しかし、それは問題ではありません。問題は、字句順での列挙はあまり役に立たないことです。、最後に無限に小さい文字を追加し続けるだけだからです。

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

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

文字列を列挙するためのより有効な順序は、長さです。数字が逆転したときに、この方法では、まずそう、これは基本的に列挙整数と同じであるなど、空の文字列、長さ1のすべての文字列は、すべての長さが2の、

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

を取得します"zz"に移動すると、あなたは99から100になる方法と同じように"aaa"を手に入れます。

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

2

まず、あなたは "" と "AA" について間違っている:

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

"foo" という文字列の後の次は何ですか?それは「フォップ」ですか?それは "fooa"ですか?それは "foo \ 0"ですか?

+18

これは明らかに '' bar ''です。 –

+0

実際、私はそれが '' foo "++ [minBound :: Char]'だと思います。 – gcbenison

4

免責事項:私はHaskellについてよく分かりません。

しかし、http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Enumから、EnumはtoEnumをサポートしていなければならず、fromEnumは列挙型をIntに変換して元に戻す必要があると思われます。これは文字列でどのように機能しますか? succ_a = "a" ++ [minBound::Char]の場合、Intは文字列に "minBound::Char"という文字列を追加します(または現実的には、nminBound::Charを含むnのリストにInt nがマップされます)。したがって、 "b"は任意のIntにマップされません。

関連する問題