【发布时间】:2011-07-14 14:55:02
【问题描述】:
如何从Int 获取sqrt。
我试试看:
sqrt . fromInteger x
但类型兼容性出错。
【问题讨论】:
如何从Int 获取sqrt。
我试试看:
sqrt . fromInteger x
但类型兼容性出错。
【问题讨论】:
也许您希望结果也是Int?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
您可能希望将floor 替换为ceiling 或round。
(顺便说一句,这个函数的类型比我给出的更通用。)
【讨论】:
fromIntegral 和floor 之间使用哪个确切类型(可能是Double、Float 等)。修复:isqrt x = floor . sqrt $ (fromIntegral x :: Float),不太优雅:(
使用fromIntegral:
Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral x)
2.23606797749979
Int 和 Integer 都是 Integral 的实例:
fromIntegral :: (Integral a, Num b) => a -> b 获取您的Int(这是Integral 的一个实例)并将其“制作”为Num。
sqrt :: (Floating a) => a -> a 需要一个Floating,而Floating 继承自Fractional,后者继承自Num,所以您可以安全地将fromIntegral 的结果传递给sqrt
我认为Haskell Wikibook 中的diagram 类在这种情况下非常有用。
【讨论】:
sqrt (fromIntegral x)也可以写成sqrt $ fromIntegral x吗?
sqrt . fromIntegral $ x
((((($)))((sqrt))(fromIntegral (x))))。
请记住,应用程序的绑定比任何其他运算符都更紧密。这包括作曲。你想要的是
sqrt $ fromIntegral x
然后
fromIntegral x
将首先评估,因为隐式应用程序(空格)比显式应用程序($)绑定得更紧密。
或者,如果您想了解合成的工作原理:
(sqrt . fromIntegral) x
括号确保首先计算组合运算符,然后生成的函数位于应用程序的左侧。
【讨论】: