gpt4 book ai didi

haskell - Haskell 中 Ratio 是如何实现的?

转载 作者:行者123 更新时间:2023-12-02 03:31:09 25 4
gpt4 key购买 nike

这是我一段时间以来一直困惑的事情,我不知道如何才能了解更多信息。假设我有以下程序:

main :: IO ()
main = do
x <- liftM read getLine
y <- liftM read getLine
print (x % y)

如果我使用输入 62 运行此命令,它将打印 3 % 1

什么时候会发生化简(即除以 gcd)?它是在show中实现的吗?如果是这样,那么有理数的底层表示仍然是 6 % 2 吗?如果不是,那么 (%) 是否会进行简化?我的印象是 (%) 是一个数据构造函数,那么数据构造函数除了“构造”之外还能做什么呢?更重要的是,我实际上如何使用自己的数据构造函数做类似的事情?

非常感谢有关该主题的任何帮助。

最佳答案

Ratio 实际上是在 GHC.Real 中实现的(显然,在 GHC 上),并且定义为

data Ratio a = !a :% !a deriving (Eq)

刘海只是为了严谨。正如您所看到的,函数 % 不是数据构造函数,但 :% 是。由于您不应该直接构造 Ratio,因此您可以使用 % 函数来调用 reduce。

reduce ::  (Integral a) => a -> a -> Ratio a
{-# SPECIALISE reduce :: Integer -> Integer -> Rational #-}
reduce _ 0 = ratioZeroDenominatorError
reduce x y = (x `quot` d) :% (y `quot` d)
where d = gcd x y
(%) :: (Integral a) => a -> a -> Ratio a
x % y = reduce (x * signum y) (abs y)

规则是,如果一个运算符以冒号:开头,那么它是一个构造函数,否则它只是一个普通的运算符。事实上,这是 Haskell 标准的一部分,所有类型运算符都必须以冒号作为第一个字符。

关于haskell - Haskell 中 Ratio 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22637515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com