In Haskell, is there infinity :: Num a => a?

后端 未结 8 1770
孤城傲影
孤城傲影 2020-12-16 10:03

I\'m trying to implement a data structure where if I had the use of infinity for numerical comparison purposes, it would simply things greatly. Note this isn\'t maxBound/min

相关标签:
8条回答
  • 2020-12-16 10:34

    Well how about that! It turns out if you just type 1/0 it returns Infinity! On ghci:

    Prelude> 1/0
    Infinity
    Prelude> :t 1/0
    1/0 :: (Fractional t) => t
    Prelude> let inf=1/0
    Prelude> filter (>=inf) [1..]
    

    and then of course it runs forever, never finding a number bigger than infinity. (But see ephemient's comments below on the actual behavior of [1..])

    0 讨论(0)
  • 2020-12-16 10:36

    There is a more principled approach based on an idea from non-standard analysis. Given a totally ordered ring R of characteristic zero, you can consider the Laurent ring R[inf,1/inf] with the natural lexicographic total ordering. For example, you have:

    for all x>0 in R,
    .. -inf < -x < -d < -d^2 < .. < 0 < .. < d^2 < d < x < inf < inf^2 < .. 
    where d = 1/inf.
    

    This way the Laurent ring R[inf,1/inf] is again a totally ordered Z-algebra, i.e. an instance of Num, with other niceties you possibly want, including +/-infinity, +/-infinitesimal, second-order infinitesimals, etc.. But note that it's not Archimedian and induction will no longer work, which is a sort of second-order arithmetic. For implementation take a look at this example. As in the comment in the code this construction should work for other algebras, such as the list monad. You can think of lists where two elements are "infinitely close" "second-order infinitely far away" etc. (which leads to a generalization of rose trees.)

    0 讨论(0)
  • 2020-12-16 10:39
    λ: let infinity = (read "Infinity")::Double
    λ: infinity > 1e100
    True
    λ: -infinity < -1e100
    True
    
    0 讨论(0)
  • 2020-12-16 10:41

    Maybe you want a Maybe type?

    data Infinite a = Infinite | Only a
    

    then write a Num instance for Num a => Infinite a, with the numeric rules you need.

    0 讨论(0)
  • 2020-12-16 10:46
    infinity = read "Infinity"
    
    0 讨论(0)
  • 2020-12-16 10:50

    If your use case is that you have boundary conditions that sometimes need to be checked, but sometimes not, you can solve it like this:

    type Bound a = Maybe a
    
    withinBounds :: (Num a, Ord a) => Bound a -> Bound a -> a -> Bool
    withinBounds lo hi v = maybe True (<=v) lo && maybe True (v<=) hi
    
    0 讨论(0)
提交回复
热议问题