32

我怎样才能sqrtInt.

我这样尝试:

sqrt . fromInteger x

但是类型兼容性会出错。

4

3 回答 3

50

也许您希望结果Int也是如此?

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

您可能想floorceiling或替换round。(顺便说一句,这个函数的类型比我给出的更通用。)

于 2011-07-14T15:23:17.647 回答
48

使用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期望 aFloatingFloating继承自Fractional,继承自Num,因此您可以安全地传递给sqrt结果fromIntegral

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

于 2011-07-14T14:58:42.823 回答
12

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

sqrt $ fromIntegral x

然后

fromIntegral x 

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

或者,如果您想了解合成的工作原理:

(sqrt .  fromIntegral) x

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

于 2011-07-14T15:02:11.657 回答