从Haskell的Int获取sqrt

0xA*_*xAX 26 haskell types sqrt

我怎样才能sqrtInt.

我试试这样:

sqrt . fromInteger x
Run Code Online (Sandbox Code Playgroud)

但是类型兼容性会出错.

aug*_*tss 40

也许你想要的结果也是Int一样的?

isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
Run Code Online (Sandbox Code Playgroud)

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

  • ghc 对此发出警告,因为它不知道在 `fromIntegral` 和 `floor`(可能是 `Double`、`Float` 等)之间使用哪种确切类型。修复:`isqrt x = floor 。sqrt $ (fromIntegral x :: Float)`,这不太优雅:( (2认同)

Mar*_*coS 39

使用fromIntegral:

Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral  x)
2.23606797749979
Run Code Online (Sandbox Code Playgroud)

这两个IntInteger是的实例Integral:

  • fromIntegral :: (Integral a, Num b) => a -> b拿你的Int(这是一个实例Integral)和"使它"成为一个Num.

  • sqrt :: (Floating a) => a -> a期望a Floating,并Floating继承自Fractional哪个继承Num,所以你可以安全地传递给sqrt结果fromIntegral

我认为,班哈斯克尔维基教科书是在此情况下非常有用.

  • 我更喜欢把它写成`((((($)))((sqrt))(fromIntegral(x))))`. (38认同)
  • `sqrt (fromIntegral x)` 也可以写成 `sqrt $ fromIntegral x` 吗? (2认同)
  • 甚至是 `sqrt 。来自积分 $ x` (2认同)

Edw*_*ard 11

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

sqrt $ fromIntegral x
Run Code Online (Sandbox Code Playgroud)

然后

fromIntegral x 
Run Code Online (Sandbox Code Playgroud)

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

或者,如果您想了解合成如何工作:

(sqrt .  fromIntegral) x
Run Code Online (Sandbox Code Playgroud)

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