我在 GHCi 中将自定义求幂 exp'
函数定义为:
let exp' x = sum $ take 100 [(x**k) / factorial k | k <- [0..]]
它产生以下类型签名:
#> :t exp'
exp' :: (Enum a, Floating a) => a -> a
但是,我希望它与 exp
函数相匹配,即
#> :t exp
exp :: Floating a => a -> a
任何人都可以解释我的 exp'
函数的 Enum a => a
类型约束吗?为什么不只是Floating a => a
?
谢谢。
最佳答案
源自 k <- [0..]
- 脱糖使用Enum
类。
然后它会传播到最终的类型签名,因为您正在使用 (**)
对于期望其参数为相同类型的求幂:
(**) :: Floating a => a -> a -> a
一种选择是使用(^)
取幂:
(^) :: (Integral b, Num a) => a -> b -> a
您还需要转换 factorial k
到正确的类型,类似于 fromIntegral
:
exp' x = sum $ take 100 [(x^k) / fromIntegral (factorial k) | k <- [0..]]
它可能更适合这种情况,因为您的指数将是整数,尽管它可能效率较低,因为它使用重复乘法(指数中的对数)而不是恒定时间浮点运算。
或者(按照评论中的建议),坚持使用 (**)
,使用fromIntegral
从枚举移至 Int
到您正在使用的实际类型:
let exp' x = sum $ take 100 [(x**fromIntegral k) / fromIntegral (factorial k)
| k <- [0..]]
关于haskell - Haskell 中的 exp x 和类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24480222/