小数类型在Haskell中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小数类型在Haskell中相关的知识,希望对你有一定的参考价值。

我想在Haskell中使用有理数字类型而不是派系类型(或者在C中使用float / double类型)

我得到以下结果:

8/(3-8/3)=23.999...
8/(3-8/3)/=24

我知道Data.Ratio。但是,它支持Data.Ratio上的(+)( - )(*)(/)操作:

1%3+3%3 == 4 % 3
8/(3-8%3) == 24 % 1

我已经检查过Racket:

(= (/ 8 (- 3 (/ 8 3))) 24)
#t

在Haskell中确保8/(3-8/3) == 24的正确方法是什么?

答案

在链中的某处使用显式类型。它将强制使用正确的类型执行整个计算。

import Data.Ratio

main = do
    print $ 8/(3-8/3) == 24
    print $ 8/(3-8/3) == (24 :: Rational)

打印

False
True
另一答案

Data.Ratio.numeratorData.Ratio.denominator以减少的形式返回分子的比率分母,因此将分母与1进行比较以检查比率是否为整数是安全的。

import Data.Ratio

eq :: (Num a, Eq a) => Ratio a -> a -> Bool
eq r i = d == 1 && n == i 
  where
    n = numerator r
    d = denominator r

main = print $ (8/(3-8%3)) `eq` 24

以上是关于小数类型在Haskell中的主要内容,如果未能解决你的问题,请参考以下文章

小数类型在Haskell中

unity项目中代码中用到的类型总结

如何在 Haskell 中连接幻像类型中的元组?

Java中代码的执行顺序

JavaScript中代码注释的正确方式是啥

解决opencv在pycharm中代码提示失效