Получить sqrt от Int в Haskell - PullRequest
26 голосов
/ 14 июля 2011

Как мне получить sqrt от Int.

Я пытаюсь так:

sqrt . fromInteger x

Но получаю ошибку с совместимостью типов.

Ответы [ 3 ]

40 голосов
/ 14 июля 2011

Возможно, вы хотите, чтобы результат также был Int?

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

Возможно, вы захотите заменить floor на ceiling или round.(Кстати, эта функция имеет более общий тип, чем тот, который я дал.)

39 голосов
/ 14 июля 2011

Использование 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 очень полезен в этих случаях.

11 голосов
/ 14 июля 2011

Помните, приложение связывается более тесно, чем любой другой оператор.Это включает в себя состав.То, что вы хотите, это

sqrt $ fromIntegral x

Тогда

fromIntegral x 

будет оцениваться в первую очередь, потому что неявное приложение (пробел) связывается более тесно, чем явное приложение ($).

В качестве альтернативы, если вы хотите увидеть, как будет работать композиция:

(sqrt .  fromIntegral) x

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

...