Подтвердить что ты не робот

Преобразование Integer в Double в Haskell

Я хочу объединить рост в течение года, но мне не нужны десятичные точки, поэтому я попробовал

take 52 $ iterate (floor . (*1.1)) 100

Проблема заключается в том, что тип (floor . (*1.1)) равен Double -> Integer, тогда как тип, ожидаемый первым аргументом итерации, равен a -> a.

Я попробовал пару подходов, но в итоге оказался привязан к узлам.

Какое предпочтительное решение для поддержания числовых типов в приложении-функции?

4b9b3361

Ответ 1

Обычный способ преобразования Int в Double заключается в использовании fromIntegral, который имеет тип (Integral a, Num b) => a -> b. Это означает, что он преобразует тип Integral (Int и Integer) в любой числовой тип b, из которых Double является экземпляром.

В вашем случае звучит так, как будто вы хотите преобразовать Double в Int, который я бы рекомендовал для floor, но вам нужно убедиться, что ваш вход является Double. Для этого вы можете использовать функцию fromIntegral с помощью

take 52 $ iterate (floor . (* 1.1) . fromIntegral) 100

Однако это даст вам неточные результаты, поскольку вы усекаетесь на каждом шаге. Я бы предложил сделать

take 52 $ map floor $ iterate (* 1.1) $ fromIntegral 100