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

me2*_*me2 26 haskell infinity

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

没希望?

Mat*_*rog 29

那怎么样!事实证明,如果你只是键入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..]
Run Code Online (Sandbox Code Playgroud)

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

  • 该死.我知道我不应该声称一个程序在看了一段有限的时间之后会永远运行. (8认同)
  • IMO,`encodeFloat(floatRadix 0 - 1)(snd $ floatRange 0)`是获得`Infinity`的更好方法(类型为`(RealFrac a)=> a`).话虽这么说,因为浮点不精确"[1 ..]`永远不会超过有限的上界,所以你在这里的表现很差. (4认同)
  • 你误会了.在某些时候,尾部只是'[x,x,x,x,x,..]`,因为当`x`足够大时浮动`x + 1 == x`,即使存在更高的,有限的`y`(例如,`encodeFloat(floatRadix 0 - 1)(snd(floatRange 0) - 1)`).显然`x <y <inf`; 我的观点是,这不是无限的好示范. (4认同)

Don*_*art 15

也许你想要一个Maybe类型?

data Infinite a = Infinite | Only a
Run Code Online (Sandbox Code Playgroud)

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

  • 不,请不要在数据声明上放置类型类约束!:-) (28认同)
  • 显而易见,没有解决方案,因此我基本上采用了您的方法:`data Num a =&gt; Inf a = NegInf | 值| PosInf`。谢谢你的帮助。 (2认同)

Den*_*s K 7

尝试这样的事情.但是,要获取Num操作(如+-),您需要NumInfinitable 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)
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句:如果你首先使用`NegativeInfinity`大小写定义你的`Infinitable`数据类型,那么`Regular`和`PositiveInfinity`最后,你可以免费派生`Ord`.(如果你这样做是为了给出一个相对简单的例子,请忽略这个评论!) (20认同)
  • 嗯,其实我不知道这个,谢谢. (2认同)

Jua*_*nto 5

?: let infinity = (read "Infinity")::Double
?: infinity > 1e100
True
?: -infinity < -1e100
True
Run Code Online (Sandbox Code Playgroud)