Haskell 分数型是在哈斯克尔

Haskell 分数型是在哈斯克尔,haskell,Haskell,我想在Haskell中使用有理数类型而不是派系类型(或者在C中使用float/double类型) 我得到以下结果: 8/(3-8/3)=23.999... 8/(3-8/3)/=24 我知道数据比率。但是,它支持对数据进行(+)(-)(*)(/)操作。比率: 1%3+3%3 == 4 % 3 8/(3-8%3) == 24 % 1 我已经登记了球拍: (= (/ 8 (- 3 (/ 8 3))) 24) #t 在Haskell中,确保8/(3-8/3)==24的正确方法是什么?并以简化形式

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

我得到以下结果:

8/(3-8/3)=23.999...
8/(3-8/3)/=24
我知道数据比率。但是,它支持对数据进行(+)(-)(*)(/)操作。比率:

1%3+3%3 == 4 % 3
8/(3-8%3) == 24 % 1
我已经登记了球拍:

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

并以简化形式将分子返回比率的分母,以便安全地将分母与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

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

import Data.Ratio

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

False
True

是不是
(数值a,等式a,比率a)=>a->a->Bool
?是一种数据类型,而不是类
eq=(==)
也可以工作(给定正确的签名)。那么Haskell数值类层次结构中的“Rational”如何?大多数这类图片只是错过了理性类型。@liuyang1这些图片通常只显示标准的前奏类型和类别。Rational没有内置到编译器中,也不是前奏曲的一部分。它只是一个库类型。你可以自己定义一个(或多个),但我认为
Rational
是前奏的一部分。运行
ghci
时,只需使用前奏,
:t(2/3::Rational)
,我们得到
(2/3::Rational)::Rational
。即使没有导入数据,您的演示代码也会通过。比率是的,对不起,我的错误。在前奏曲中。不知道,那么
Rational
实际上并不是一种独特的类型;它是
比率整数
的别名。因为它是一个类型构造函数,而不是一个类型类,所以它不会出现在类层次结构中。