import Data.Ratio myEnumFromThen :: (Fractional a) => a -> a -> [a] myEnumFromThen n m = n `seq` m `seq` (n : myEnumFromThen m (m+m-n)) myEnumFromThenTo :: (Ord a, Fractional a) => a -> a -> a -> [a] myEnumFromThenTo e1 e2 e3 = takeWhile predicate (myEnumFromThen e1 e2) where predicate | e2 >= e1 = (<= e3) | otherwise = (>= e3) main = do print $ (myEnumFromThenTo 1.5 1.8 2.999999999999999 :: [Float]) print $ (myEnumFromThenTo 1.5 1.8 2.99999999999 :: [Ratio Int]) print $ (myEnumFromThenTo 1.5 1.8 2.999999999 :: [Ratio Int]) print $ (myEnumFromThenTo 1.5 1.8 2.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 :: [Ratio Integer]) print $ (myEnumFromThenTo 0 (1%3) 2.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 :: [Ratio Integer]) print $ (myEnumFromThenTo 0 (1%3) 3.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :: [Ratio Integer]) print $ (myEnumFromThenTo 0 (1%3) 3.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 :: [Ratio Integer])