##Enumの本質は列挙だとすると,すべての要素にユニークに番号を振れればよいというこですよね.
#当然 Enum a かつ Enum b ならば Enum (a,b) なはず.
#実際にHaskellで構成できるかというと,これが結構むずかしい.それは,toEnum の実装が不完全だからだと思われる.
#あ.よびすてしてる.御免なさい > @na2hiroさん
#toEnum :: Enum a => Int -> a
#本質的にはIntじゃなくてNatであるべきかな.
#でしかも適切に定義された全関数でないといけない.
#とまでは考えたけど.さて.
#Enum a かつ Bounded a で minBound から succ だけで maxBound まですべて列挙できないものってどんなもの?
#ああ.いろいろ変なのがあるなぁ.Float と Double が Bounded じゃない.
#Float と Double が Enum だというのも解せない.
#ああ Bounded じゃないのは Infinity があるから?
#文脈読んでないけどFloatとDoubleが(概念的な実数でなく)現実の浮動小数点数に対応してるなら、NaNと無限大を除いて有限範囲の整数と1対1対応づけ可能ですね。
#Enumの法則って,toEnum が fromEnum の左逆関数になっているってことだけですよねぇ.
#現実の浮動小数点数、って変か。IEEE754とかの具体的な実装ってことです。
#有限桁のビットで表現できるなら有限個の連続する自然数と1対1に対応しますね.
#HaskellではDoubleがEnumのインスタンスと宣言されているんですが,インスタンス定義はすこし変で.toEnumがfromEnum
#の左逆関数になっていないんですよ.
#困らないの?
#困ったことないです.
#そもそも,DoubleをEnumとして扱うことがあんまりないので...
#なんかメタ的操作するときに困りそうな予感。Doubleを含むプログラムのゲーデル数を求める…なんてことそもそもしないか。
#しないっす.:)
#ある精度において,ある浮動小数点数からその「となり」の浮動小数点数って定数時間とかで求められるんですか?
#Haskellならできます!!
#succ 1.25 をお試しあれ.ぜったい なんじゃこりゃ って声がでます.
#いやHaskellのFloatやDoubleの雑なEnum性じゃなくてですね
#精度固定と隣の定義によります.
#「隣」は数直線上の「隣」で
#それは定数時間ではむりでしょう.
#ですよね.でも,そうでないとヒトのEnumから受ける直観と異なるし,使いにくい.
#ああでもできそう
#な気がしてきた
#テーブルを作っておけばいいだけだな.
#IEEE754みたいな定義なら値が与えられれば隣との間隔は決まるのですぐに求まると思うんですがそういう話じゃなくて?
#そうでしたっけ?
#仮数部増やすだけか?
#もともとの話は
#Enum a かつ Enum b のとき Enum (a,b) を定義できるかという問題です.うまくやればできそうですよね.(最初のこころみ @na2hiroさんが間違いを指摘してくれました.)
#ぐるぐるやればってことですよね,で,Boundedつっこまれてそこで切れると
#です.
#切られたところから次へワープできれば.
#Boundedかそうでないかによらず,n番目までのどこかで切れたかの検出はできるけど,それにはEqと線形時間が必要か.キツい.できないって答えたい
#あ,Eqはいらないか