Marcin 'Qrczak' Kowalczyk <[EMAIL PROTECTED]> writes > I would use a simpler interface: > > arithSequence :: Num a => a{-start-} -> a{-step-} -> [a] > > take 300 (arithSequence (-3.0) 0.02) > arithSequence (-3.0) 0.02 > takeWhile (<3.01) (arithSequence (-3.0) 0.02) Yes, this is better. Generally, the idea was that the domains like T = Float hardly ever need Enum, because fromTo, succ look counter-intuitive there. Probably, what the users wanted was the arithmetic sequences inside T. And the latters are achieved independently of Enum. ----------------------- But what Enum is for? Maybe, it worth to consider the following. 1. Finitely-enumerated domain `a' - the doubtless Enum instance. There fit toEnum :: Integer -> Maybe a fromEnum :: a -> Integer succ, pred :: a -> Maybe a For example: toEnum 0 :: Maybe Bool = Just True toEnum 1 :: Maybe Bool = Just False toEnum 2 :: Maybe Bool = Nothing fromEnum False = 1 succ True = Just False succ False = Nothing And we put that the numeration domain is [0..h] :: [Integer], toEnum, fromEnum should be the reciprocally inverse bijections a <--> [0..h]. toEnum n returns Nothing for n out of [0..h]. This reflects that toEnum is a partial map. These maps induce the ordering independent of Ord; Ord is not a superclass of Enum; succ, pred are defined according to fromEnum. 2. Countably-enumerated domain `a' toEnum, toEnum' :: Integer -> a fromEnum, fromEnum' :: a -> Integer succ, pred, pred' :: a -> a toEnum, fromEnum should be the reciprocally inverse bijections between a <--> [0..] toEnum n to break with error for n < 0; pred (toEnum 0) to break with error. toEnum', fromEnum' should be the reciprocally inverse bijections between a <--> Integer I doubt how to eliminate these '-s. For Integer looks better when mapped with Integer, rather than with [0..], and NonNegativeInteger looks better with [0..] ... What domains should be standardly countably-enumerated? For example, any data C a = C a deriving (Enum) has to induce standardly Enum from a to C a. Should Float be standardly enumerated? I suggest - it should not. Because Float is close ideologically to RealNumber, and there does not exist a bijection Integer <--> RealNumber: there are too few of integers to enumerate the reals. Nother reason is as follows for Rational. Should Rational be standardly enumerated? I suggest - it should not. Rational can be enumerated bijectively with [0..] :: [Integer]. But any such enumeration would be too "deliberate". There is only one definition of `compare' on Rational that agrees with the arithmetic. Therefore Rational is very naturally a *standard* instance of Ord. With the enumeration, the situation is different. It brings another ordering to Rational, which does not agree with the arithmetic; succ, pred are considered in the sense of this Enum ordering. There are too many such enumerations. For each particular task exploiting some enumeration, the user has to choose its own enumeration for Rational, to make the solution efficient. Usually, changing the enumeration changes many times the cost of solution. Therefore, it is better to define the user instance rather than the standard one. Similarly, (a,b), [a] should not have the standard Enum instances. It remains, maybe, to unify the operation types for the finitely-enumerated and countably-enumerated domains. ------------------ Sergey Mechveliani [EMAIL PROTECTED]