Получить sqrt от Int в Haskell
как я могу получить sqrt
С Int
.
Я попробовать так:
sqrt . fromInteger x
но получаю ошибку с совместимостью типов.
3 ответов
используя fromIntegral
:
Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral x)
2.23606797749979
и Int
и Integer
экземпляров Integral
:
fromIntegral :: (Integral a, Num b) => a -> b
берет свойInt
(который является экземпляромIntegral
) и "делает" егоNum
.sqrt :: (Floating a) => a -> a
ждетFloating
иFloating
наследовать отFractional
, который наследует отNum
, так что вы можете спокойно пройти кsqrt
результатfromIntegral
я думаю, что занятия - схемы на Haskell Wikibook весьма полезно в этом случае.
возможно, вы хотите, чтобы результат был Int
а?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
вы можете заменить floor
С ceiling
или round
.
(Кстати, эта функция имеет более общий тип, чем тот, который я дал.)
помните, приложение связывается более плотно, чем любой другой оператор. Это включает в себя композицию. То, что вы хотите
sqrt $ fromIntegral x
затем
fromIntegral x
будет оценено сначала, потому что неявное приложение (пространство) связывается более плотно, чем явное приложение ($).
альтернативно, если вы хотите увидеть, как будет работать композиция:
(sqrt . fromIntegral) x
скобки убедитесь, что сначала вычисляется оператор композиции, а затем результирующий функция-это левая сторона приложения.