Get sqrt from Int in Haskell

前端 未结 3 1810
被撕碎了的回忆
被撕碎了的回忆 2020-12-15 04:07

How can I get sqrt from Int.

I try so:

sqrt . fromInteger x

But get error with types compatibility.

相关标签:
3条回答
  • 2020-12-15 04:27

    Perhaps you want the result to be an Int as well?

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

    You may want to replace floor with ceiling or round. (BTW, this function has a more general type than the one I gave.)

    0 讨论(0)
  • 2020-12-15 04:30

    Remember, application binds more tightly than any other operator. That includes composition. What you want is

    sqrt $ fromIntegral x
    

    Then

    fromIntegral x 
    

    will be evaluated first, because implicit application (space) binds more tightly than explicit application ($).

    Alternately, if you want to see how composition would work:

    (sqrt .  fromIntegral) x
    

    Parentheses make sure that the composition operator is evaluated first, and then the resulting function is the left side of the application.

    0 讨论(0)
  • 2020-12-15 04:42

    Using fromIntegral:

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

    both Int and Integer are instances of Integral:

    • fromIntegral :: (Integral a, Num b) => a -> b takes your Int (which is an instance of Integral) and "makes" it a Num.

    • sqrt :: (Floating a) => a -> a expects a Floating, and Floating inherit from Fractional, which inherits from Num, so you can safely pass to sqrt the result of fromIntegral

    I think that the classes diagram in Haskell Wikibook is quite useful in this cases.

    0 讨论(0)
提交回复
热议问题