如何从sqrt
获取Int
。
我试试:
sqrt . fromInteger x
但是在类型兼容性方面会出错。
答案 0 :(得分:39)
使用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
,因此您可以安全地传递给{{ 1}} sqrt
我认为diagram中的Haskell Wikibook类在这种情况下非常有用。
答案 1 :(得分:39)
也许您希望结果也是Int
?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
您可能希望将floor
替换为ceiling
或round
。
(顺便说一下,这个函数比我给出的函数更通用。)
答案 2 :(得分:11)
请记住,应用程序绑定比任何其他运算符更紧密。这包括组成。你想要的是
sqrt $ fromIntegral x
然后
fromIntegral x
将首先进行评估,因为隐式应用程序(空格)比显式应用程序($)绑定得更紧密。
或者,如果你想看看合成是如何工作的:
(sqrt . fromIntegral) x
括号确保首先计算合成运算符,然后生成的函数是应用程序的左侧。