30

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

没有希望?

4

9 回答 9

30

那怎么样!事实证明,如果你只是输入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..]

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

于 2010-03-01T09:16:16.890 回答
27
infinity = read "Infinity"
于 2010-03-02T20:48:30.563 回答
17

也许你想要一个 Maybe 类型?

data Infinite a = Infinite | Only a

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

于 2010-03-01T09:11:42.763 回答
10

尝试这样的事情。但是,要获取Num操作(如+or -),您需要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)
于 2010-03-01T09:22:01.430 回答
6
λ: let infinity = (read "Infinity")::Double
λ: infinity > 1e100
True
λ: -infinity < -1e100
True
于 2013-09-14T06:13:05.970 回答
2

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

于 2010-03-06T09:44:51.400 回答
2

您可以使用提供typeclass的ieee754。这个类型类有一个成员。类型类是为、和实现的。IEEEinfinityFloatDoubleCFloatCDouble

因此,您安装该ieee-754软件包,然后通过以下方式获得正无穷大(或负无穷大):

ghci> import Numeric.IEEE
ghci> infinity :: Double
Infinity
ghci> -infinity :: Double
-Infinity

对于Floats、Doubles 等,它被实现为 [src]

    infinity = 1/0
于 2021-11-28T17:11:12.163 回答
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
于 2010-03-01T16:39:10.613 回答
1

有一种基于非标准分析的想法的更有原则的方法。给定一个特征为零的全序环 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.

这样,洛朗环 R[inf,1/inf] 又是一个完全有序的 Z 代数,即 的一个实例Num,具有您可能想要的其他细节,包括 +/- 无穷大、+/- 无穷小、二阶无穷小、等等。但请注意,它不是阿基米德,归纳将不再起作用,这是一种二阶算术。对于实施看这个例子。就像代码中的注释一样,这种构造应该适用于其他代数,例如 list monad。您可以想到两个元素“无限接近”“二阶无限远”等的列表(这导致了玫瑰树的泛化。)

于 2017-07-25T15:48:41.493 回答