gpt4 book ai didi

haskell - 将数字提高到分数(Data.Ratio)幂?

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

2^(2%1) 这样的表达式在 GHCi 中不会进行类型检查,并且错误消息是神秘的。为什么这不起作用,我需要改变什么?

我无法转换为其他类型,我希望将其用于 27^(1%3) 等表达式。

最佳答案

Haskell 有三个幂运算符:

  1. (^)::(数值 a, 积分 b) => a -> b -> a

    这会使用正积分指数得出任何类型的数字。

    在输入 2^(2%3) 时,您会收到类似 Could not deduced (Integral (Ratio a0)) 的错误,因为使用了“^”因为 Data.Ratio 不是 Integral 的实例。 GHC 发现 ^ 想要一个 Integral 并注意到 Data.Ratio 在这种情况下不能使用。

  2. (^^)::(分数 a,积分 b)=> a -> b -> a

    此运算符允许使用负积分指数。请记住x^(-n) == 1/(x^n)。这就是为什么它需要Fractional

    请注意,指数仍必须是整数。 2^^(1%2) 不是小数数字。

  3. (**):: float a => a -> a -> a

    这是“catch all”运算符。它可以将小数求小数次幂。然而,这使用 float ,而不是精确的有理数。

由于我们无法表示所有实数,因此当您需要不精确的运算时,他们决定简单地依赖 float 。

因此您应该使用类型转换来执行该操作。 一个可能的实现可能是:

realToFrac $ 27**(realToFrac $ 2%3) :: Rational

或者您可以定义一个新的运算符:

(*^*) :: (RealFrac a, RealFrac b) => a -> b -> a
x *^* y = realToFrac $ realToFrac x ** realToFrac y

这将允许你写:

27 *^* (2%3)

我使用了两个*来提醒实现中使用的**,并且我添加了一个^引用前两个运算符的类型...不确定这是否有意义,或者 ^**^^* 会更好。

但是,简单地使用 Double 可能会更好。这实际上取决于数字代表什么以及您用它们做什么。

关于haskell - 将数字提高到分数(Data.Ratio)幂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175510/

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