gpt4 book ai didi

haskell - Haskell 中的求幂

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

有人能告诉我为什么 Haskell Prelude 定义了两个单独的求幂函数(即 ^**)吗?我认为类型系统应该消除这种重复。

Prelude> 2^2
4
Prelude> 4**0.5
2.0

最佳答案

实际上存在三个求幂运算符:(^)(^^)(**)^ 为非负积分幂,^^ 为整数幂,** 为浮点幂:

(^) :: (Num a, Integral b) => a -> b -> a
(^^) :: (Fractional a, Integral b) => a -> b -> a
(**) :: Floating a => a -> a -> a

原因是类型安全:数值运算的结果通常与输入参数具有相同的类型。但您无法将 Int 进行浮点幂并获得 Int 类型的结果。因此类型系统会阻止您执行此操作:(1::Int) ** 0.5 会产生类型错误。 (1::Int) ^^ (-1) 也是如此。

另一种表达方式:Num 类型在 ^ 下封闭(它们不需要具有乘法逆元),Fractional 类型在 ^^ 下封闭,Floating 类型在 ** 下封闭。由于 Int 没有 Fractional 实例,因此您无法将其计算为负数。

理想情况下,^ 的第二个参数静态约束为非负数(目前,1 ^ (-2) 会引发运行时异常)。但 Prelude 中没有自然数的类型。

关于haskell - Haskell 中的求幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6400568/

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