How can I get sqrt from Int.
I try so:
sqrt . fromInteger x
But get error with types compatibility.
How can I get sqrt from Int.
I try so:
sqrt . fromInteger x
But get error with types compatibility.
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.)
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.
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.