Parece que qualquer instância vinculada deve ter uma implementação sã do Enum. Pessoalmente, não consigo pensar em um contra-exemplo, embora, se alguém criar um que não seja patológico, entenderei por que não é esse o caso.
Ao executar :i
nas duas classes de tipos, parece que a única exceção atualmente na biblioteca padrão é para tuplas, que são limitadas, mas não enums. No entanto, qualquer tupla limitada também deve ser enumerável de maneira sã, simplesmente incrementando o último elemento e, em seguida, contornando quando se trata de maxBound.
Essa alteração provavelmente envolveria também a adição predB
e / nextB
ou algo parecido a Bounded, para uma maneira segura / em loop de percorrer os valores de Enum. Nesse caso, toEnum 0 :: (...)
seria igual a(toEnum 0, toEnum 0, ...) :: (...)
Double
/ Float
e todos os tipos similares implementados de Enum
qualquer maneira, eles apenas produzem succ = (+ 1)
e fromEnum = truncate
. O jeito de Haskell, na verdade, faz sentido do ponto de vista da praticidade, caso contrário [0, 0,5 ..] e similares não funcionariam, então parece que Haskell não se preocupa com a responsabilidade quando se trata de Enums.
succ
é (+1)
. Isso é estranho, porque Double
e Float
não tem precisão infinita e, portanto, é enumerável - succ
poderia ter sido definido como +1 ULP .