我正在尝试实现一个数据结构,如果我使用无穷大进行数字比较,那就简单了.请注意,这不是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..])
Don*_*art 15
也许你想要一个Maybe类型?
data Infinite a = Infinite | Only a
Run Code Online (Sandbox Code Playgroud)
然后使用您需要的数字规则为Num a => Infinite a写一个Num实例.
尝试这样的事情.但是,要获取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)
Run Code Online (Sandbox Code Playgroud)
?: let infinity = (read "Infinity")::Double
?: infinity > 1e100
True
?: -infinity < -1e100
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15477 次 |
| 最近记录: |