在Haskell中,是否存在无穷大:: Num a =>一个?

时间:2010-03-01 09:02:01

标签: haskell infinity

我正在尝试实现一个数据结构,如果我使用无穷大进行数字比较,那么它就会非常简单。请注意,这不是maxBound / minBound,因为值可以是< = maxbound,但所有值都是<无穷大。

没希望?

8 个答案:

答案 0 :(得分:27)

那怎么样!事实证明,如果您只需输入1/0,它就会返回Infinity!在ghci:

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

然后它当然会永远运行,永远不会找到比无穷大更大的数字。 (但请参阅下面关于[1..]

的实际行为的ephemient的评论

答案 1 :(得分:19)

infinity = read "Infinity"

答案 2 :(得分:15)

也许你想要一个Maybe类型?

data Infinite a = Infinite | Only a

然后为Num a =>写一个Num实例无限a,使用您需要的数字规则。

答案 3 :(得分:6)

尝试这样的事情。但是,要获得Num次操作(例如+-),您需要为Num类型定义Infinitable a个实例。就像我为Ord课做的那样。

data Infinitable a = Regular a | NegativeInfinity | PositiveInfinity deriving (Eq, Show)

instance Ord a => Ord (Infinitable a) where
    compare NegativeInfinity NegativeInfinity = EQ
    compare PositiveInfinity PositiveInfinity = EQ
    compare NegativeInfinity _ = LT
    compare PositiveInfinity _ = GT
    compare _ PositiveInfinity = LT
    compare _ NegativeInfinity = GT
    compare (Regular x) (Regular y) = compare x y    

main =
    let five = Regular 5
        pinf = PositiveInfinity::Infinitable Integer
        ninf = NegativeInfinity::Infinitable Integer
        results = [(pinf > five), (ninf < pinf), (five > ninf)]
    in
        do putStrLn (show results)

答案 4 :(得分:4)

λ: let infinity = (read "Infinity")::Double
λ: infinity > 1e100
True
λ: -infinity < -1e100
True

答案 5 :(得分:2)

看看我的RangedSets library,它以非常一般的方式完成了这一点。我定义了一个“边界”类型,因此“Boundary a”类型的值总是高于或低于任何给定的“a”。边界可以是“AboveAll”,“BelowAll”,“Above x”和“Below x”。

答案 6 :(得分:1)

如果您的用例是您有时需要检查的边界条件,但有时不需要,您可以这样解决:

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

答案 7 :(得分:0)

基于非标准分析的想法,有一种更有原则的方法。给定一个特征为零的完全有序的环R,您可以考虑使用自然词典总排序的Laurent环R [inf,1 / inf]。例如,您有:

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

这样Laurent环R [inf,1 / inf]又是一个完全有序的Z-代数,即Num的一个实例,还有你想要的其他细节,包括+/-无穷大,+ / - 无限小,二阶无穷小等。但请注意,它不是阿基米德式的,归纳将不再起作用,这是一种二阶算术。要实现,请查看this example。如在代码中的注释中,此构造应该适用于其他代数,例如列表monad。你可以想到两个元素是无限接近的列表。 &#34;无限远的二阶&#34;等(导致玫瑰树的泛化。)