两个问题。首先,你不想
(^)
,而是
(^^)
(如果指数总是整数)或
(**)
(如果需要浮点指数):
Prelude> :t (^)
(^) :: (Integral b, Num a) => a -> b -> a
Prelude> :t (^^)
(^^) :: (Fractional a, Integral b) => a -> b -> a
Prelude> :t (**)
(**) :: Floating a => a -> a -> a
其次
RealFrac
不仅覆盖浮点数,
exact fractions
。如果您确实需要使用函数
(**)
和
与任何
RealFrac公司
您需要使用
realToFrac
:
Prelude> :t realToFrac
realToFrac :: (Fractional b, Real a) => a -> b
当然,如果你定义
splitFunc r l = realToFrac r ** realToFrac l
并传递精确的分数(例如
Ratio Integer
)对它来说,精确分数的额外精度将丢失,因为
(**)
是浮点运算。