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.