【问题标题】:Get sqrt from Int in Haskell从 Haskell 中的 Int 获取 sqrt
【发布时间】:2011-07-14 14:55:02
【问题描述】:

如何从Int 获取sqrt

我试试看:

sqrt . fromInteger x

但类型兼容性出错。

【问题讨论】:

    标签: haskell types sqrt


    【解决方案1】:

    也许您希望结果也是Int

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

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

    【讨论】:

    • ghc 对此发出警告,因为它不知道在fromIntegralfloor 之间使用哪个确切类型(可能是DoubleFloat 等)。修复:isqrt x = floor . sqrt $ (fromIntegral x :: Float),不太优雅:(
    • 无论如何我都喜欢。 GHC 8 上没有警告。
    【解决方案2】:

    使用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 需要一个Floating,而Floating 继承自Fractional,后者继承自Num,所以您可以安全地将fromIntegral 的结果传递给sqrt

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

    【讨论】:

    • sqrt (fromIntegral x)也可以写成sqrt $ fromIntegral x吗?
    • 是的,确实可以,因为显式应用程序 ($) 不像隐式应用程序那样紧密绑定。
    • 甚至sqrt . fromIntegral $ x
    • 我更喜欢写成((((($)))((sqrt))(fromIntegral (x))))
    【解决方案3】:

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

    sqrt $ fromIntegral x
    

    然后

    fromIntegral x 
    

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

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

    (sqrt .  fromIntegral) x
    

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

    【讨论】:

      猜你喜欢
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多