首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >小数类型在Haskell。

小数类型在Haskell。
EN

Stack Overflow用户
提问于 2019-02-14 06:27:10
回答 2查看 1.1K关注 0票数 5

我希望在Haskell中使用有理数类型而不是派系类型(或者在C中使用浮动/双类型)。

我得到的结果如下:

代码语言:javascript
运行
复制
8/(3-8/3)=23.999...
8/(3-8/3)/=24

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

代码语言:javascript
运行
复制
1%3+3%3 == 4 % 3
8/(3-8%3) == 24 % 1

我查过球拍了:

代码语言:javascript
运行
复制
(= (/ 8 (- 3 (/ 8 3))) 24)
#t

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-14 07:05:16

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

代码语言:javascript
运行
复制
import Data.Ratio

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

打印

代码语言:javascript
运行
复制
False
True
票数 8
EN

Stack Overflow用户

发布于 2019-02-14 06:47:27

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

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54684384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档