从Haskell的Int获取sqrt

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Haskell的Int获取sqrt相关的知识,希望对你有一定的参考价值。

我如何从sqrt获得Int

我试试这样:

sqrt . fromInteger x

但是类型兼容性会出错。

答案

使用fromIntegral

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

IntInteger都是Integral的例子:

  • fromIntegral :: (Integral a, Num b) => a -> b带你的Int(这是Integral的一个例子)并且“使它”成为Num
  • sqrt :: (Floating a) => a -> a期待一个FloatingFloating继承自Fractional,继承自Num,所以你可以安全地传递到sqrt fromIntegral的结果

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

另一答案

也许你想要结果也是Int

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

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

另一答案

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

sqrt $ fromIntegral x

然后

fromIntegral x 

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

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

(sqrt .  fromIntegral) x

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

以上是关于从Haskell的Int获取sqrt的主要内容,如果未能解决你的问题,请参考以下文章

用于简化递归的惯用 Haskell 代码

haskell 生成 FFI 导出包装代码

Haskell:如何将 IO 输入字符串解析为 Float(或 Int 或其他)?

Haskell类型错误

haskell中的多态函数列表?

我如何获得haskell中元组的索引?