我希望在Haskell中使用有理数类型而不是派系类型(或者在C中使用浮动/双类型)。
我得到的结果如下:
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
我查过球拍了:
(= (/ 8 (- 3 (/ 8 3))) 24)
#t
在Haskell中确保8/(3-8/3) == 24
的正确方法是什么?
发布于 2019-02-14 07:05:16
在链中的某个位置使用显式类型。它将强制使用corrrect类型执行整个计算。
import Data.Ratio
main = do
print $ 8/(3-8/3) == 24
print $ 8/(3-8/3) == (24 :: Rational)
打印
False
True
发布于 2019-02-14 06:47:27
Data.Ratio.numerator和Data.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
https://stackoverflow.com/questions/54684384
复制相似问题