从Haskell的Int获取sqrt

时间:2011-07-14 14:55:03

标签: haskell types sqrt

如何从sqrt获取Int

我试试:

sqrt . fromInteger x

但是在类型兼容性方面会出错。

3 个答案:

答案 0 :(得分:39)

使用fromIntegral

Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral  x)
2.23606797749979

IntInteger都是Integral的实例:

  • fromIntegral :: (Integral a, Num b) => a -> b获取IntIntegral的实例),并将其设为Num

  • sqrt :: (Floating a) => a -> a期望从Floating继承FloatingFractional,继承自Num,因此您可以安全地传递给{{ 1}} sqrt

  • 的结果

我认为diagram中的Haskell Wikibook类在这种情况下非常有用。

答案 1 :(得分:39)

也许您希望结果也是Int

isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral

您可能希望将floor替换为ceilinground。 (顺便说一下,这个函数比我给出的函数更通用。)

答案 2 :(得分:11)

请记住,应用程序绑定比任何其他运算符更紧密。这包括组成。你想要的是

sqrt $ fromIntegral x

然后

fromIntegral x 

将首先进行评估,因为隐式应用程序(空格)比显式应用程序($)绑定得更紧密。

或者,如果你想看看合成是如何工作的:

(sqrt .  fromIntegral) x

括号确保首先计算合成运算符,然后生成的函数是应用程序的左侧。