Получить 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

скобки убедитесь, что сначала вычисляется оператор композиции, а затем результирующий функция-это левая сторона приложения.